使用Git,如何判断我的分支中的一个提交是否是另一个提交的后代?
从Git 1.8.0开始,支持以下选项merge-base
:
git merge-base --is-ancestor
从手册页:
--is始祖
检查第一个是否是第二个的祖先,如果为true则退出状态0,否则退出状态1.错误由非零状态发出信号,该状态不为1.
例如:
git merge-base --is-ancestor origin/master master; echo $?
如果要以编程方式检查(例如,在脚本中),可以检查是否git merge-base A B
等于git rev-parse --verify A
(然后A可以从B到达),或者是否等于git rev-parse --verify B
(然后B可以从A到达). git rev-parse
这里需要从提交名称转换为提交SHA-1/commit id.
git rev-list
在VonC中使用类似的答案也是可能的.
如果你提出的一个提交是一个分支提示,那么git merge-base --is-ancestor
或者git branch --contains
可能是更好的非程序化解决方案.
这种操作依赖于SO问题中详述的修订范围的概念:" git log origin/master'与'git log origin/master ...'的区别 ".
git rev-list
应该能够从提交中返回,直到另一个提交为止.
所以我会尝试:
git rev-list --boundary 85e54e2408..0815fcf18a 0815fcf18a19441c1c26fc3495c4047cf59a06b9 8a1658147a460a0230fb1990f0bc61130ab624b2 -85e54e240836e6efb46978e4a1780f0b45516b20
(边界提交以前缀为前缀-
)
如果显示的最后一次提交与git rev-list
命令中的第一次提交相同,那么它是可从第二次提交到达的提交.
如果第一次提交无法从第二次提交,则git rev-list
不应返回任何内容.
git rev-list --boundary A..B
将完成A
,如果A
可以从B
.
它与:
git rev-list --boundary B --not A
与B
一个正参考,和A
一个负参考.
它将从B
图表开始并向后走,直到遇到可从中访问的修订版A
.
我认为如果A
可以直接到达B
,它将会遇到(并显示,因为--boundary
选项)A
本身.
另一种方法是使用git log和grep.
git log --pretty=format:%H abc123 | grep def456
如果提交def456是commit abc123的祖先,则会产生一行输出,否则不输出.
你通常可以省略"--pretty"参数,但是如果你想确保只搜索实际的提交哈希值而不是通过日志注释等等,那么它就可以了.