如何将日志限制为给定提交的所有后代?

2024-01-17

鉴于历史

      X-Y    <- feature
     /
A-B-C-D-E    <- master

我想获取给定提交的后代。一种解决方案似乎是:

git log --all --ancestry-path <ref>^!

然而,这种行为有点奇怪:

  • when <rev> is C,结果是CDEXY
  • when <rev> is D or X,结果是DEXY(诡异的!)
  • when <rev> is E,结果是E

我的理解是该命令并没有得到所有的孩子<rev>;相反,它获取parent-of(ref) 的所有子级。我对吗?

这是不直观的,容易出错,而且坦率地说,令人恼火。我应该如何运行命令,以便将日志限制为给定提交的后代。


如何将日志限制为给定修订的所有后代

据我所知,没有内置的 Git 命令可以做到这一点。不过,你已经快到了。尝试

git log --all --ancestry-path ^<rev>

反而。这应该将日志限制为<rev>;请注意,严格来说,<rev>不是其自身的子项,因此不会列出。

例如,在我的玩具仓库中(我复制了你的;请参阅我的答案的底部),

git log --all --ancestry-path ^D

限制日志提交E, and

git log --all --ancestry-path ^X

限制日志提交Y.

出了什么问题git log --all --ancestry-path D^!?

TL; DR

我的理解是该命令并没有得到所有的孩子<rev>;相反,它获取parent-of(ref) 的所有子级。我对吗?

是的;你的底部提交差一分。

Details

因为,在你的例子中,提交D and X是对称的,我们只关注提交D并解构命令

git log --all --ancestry-path D^!

根据相关的 Git 手册页 http://git-scm.com/docs/revisions,

后缀^后面跟一个感叹号与给予 commit 相同<rev>然后它的所有父母都以前缀^排除他们(和他们的祖先)。

此外,根据git-log手册页 http://git-scm.com/docs/git-log,

--all

假装 refs/ 中的所有引用都在命令行上列出:<commit>.

因此,在你的情况下

git log --all --ancestry-path D^!

相当于

git log --ancestry-path D ^C feature master

而且,因为D可以从以下位置到达master,后一个命令减少为

git log --ancestry-path ^C feature master

这给出了可从任一处访问的所有提交的日志feature或大师,但不包括C或其任何祖先,并且您得到提交D, E, X, and Y.

如你看到的,你的底部提交少了一位。你真正想跑什么

git log --ancestry-path ^D feature master

这与以下相同

git log --all --ancestry-path ^D

Test

以下命令重新创建您的玩具存储库:

$ mkdir gittest
$ cd gittest/
$ git init

$ printf "A\n" > README
$ git add README
$ git commit -m "A"

$ printf "B\n" >> README
$ git commit -am "B"

$ printf "C\n" >> README
$ git commit -am "C"

$ git branch feature

$ printf "D\n" >> README
$ git commit -am "D"

$ printf "E\n" >> README
$ git commit -am "E"

$ git checkout feature
$ printf "X\n" >> README
$ git commit -am "X"

$ printf "Y\n" >> README
$ git commit -am "Y"

$ git log --all --oneline --graph --decorate
* e234427 (HEAD -> feature) Y
* cf98c6b X
| * b3d493a (master) E
| * e2bb266 D
|/  
* dfe0267 C
* 0be7d42 B
* 674356e A

(请注意,提交D and X可以通过它们的 SHA 来引用,或者更简单地,通过master~ and feature~, 分别。)

您建议的命令(我已添加--oneline标志,以减少输出)确实如此not将日志限制为给定提交的后代:

# master~ = D
$ git log --all --ancestry-path --oneline master~^!
e234427 Y
cf98c6b X
b3d493a E
e2bb266 D

# feature~ == X
$ git log --all --ancestry-path --oneline feature~^!
e234427 Y
cf98c6b X
b3d493a E
e2bb266 D

但我建议的那个是:

# master~ == D
$ git log --all --ancestry-path --oneline ^master~
b3d493a E

# feature~ == X
$ git log --all --ancestry-path --oneline ^feature~
e234427 Y
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将日志限制为给定提交的所有后代? 的相关文章

随机推荐