如何将日志限制为给定版本的所有后代
据我所知,Git没有内置命令来执行此操作。但是,您已经接近成功了。请尝试:
git log --all --ancestry-path ^<rev>
相反,应该限制日志仅包含<rev>
的后代;请注意,严格来说,<rev>
不是其自身的子元素,因此不会被列出。
例如,在我的示例存储库中(我复制了您的存储库;请参见我的答案底部),
git log --all --ancestry-path ^D
把日志限制在提交 E
中,然后
git log --all --ancestry-path ^X
将日志限制为提交Y
。
git log --all --ancestry-path D^!
有什么问题?
TL;DR
我的理解是该命令未获取<rev>
的所有子代;相反,它获取了(ref)的父级的所有子代。我是对的吗?
是的,你的底部提交少了一个。
详细信息
因为在您的示例中,提交D
和X
是对称的,所以让我们只关注提交D
并拆分命令。
git log --all --ancestry-path D^!
根据
相关的Git手册页面,
后缀 ^
加上叹号的意思相当于给定提交 <rev>
和它所有的父提交加上前缀 ^
以排除它们(及其祖先)。
此外,根据
git-log
手册页面,
--all
假装所有refs/中的引用都像命令行中列出的<commit>
一样。
因此,在您的情况下。
git log --all --ancestry-path D^!
等同于
git log --ancestry-path D ^C feature master
此外,由于从
master
可以到达
D
,所以后者的命令简化为:
git log --ancestry-path ^C feature master
这将列出所有从
feature
或master可达的提交记录,但不包括
C
或其祖先,并获取提交记录
D
、
E
、
X
和
Y
。请注意,
您底部的提交记录有误差。您真正想要运行的命令是:
git log --ancestry-path ^D feature master
这与
git log --all --ancestry-path ^D
测试
以下命令可重新创建您的玩具存储库:
$ 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和X可以用它们的SHA引用,或更简单地用master〜和feature〜引用。)
你建议的命令(我已添加了--oneline标志以减少输出)确实没有限制日志到给定提交的后代:
$ git log --all --ancestry-path --oneline master~^!
e234427 Y
cf98c6b X
b3d493a E
e2bb266 D
$ git log --all --ancestry-path --oneline feature~^!
e234427 Y
cf98c6b X
b3d493a E
e2bb266 D
但我建议的确实可以:
$ git log --all --ancestry-path --oneline ^master~
b3d493a E
$ git log --all --ancestry-path --oneline ^feature~
e234427 Y
D^!
等同于D ^D
。不客气! - jub0bsD^!
等同于D ^D~
*。尝试一下,看看是否会出现“没有底部提交”的错误。 - jub0bs