如何将日志限制为给定修订的所有后代
据我所知,没有内置的 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