如何判断一个提交是否是另一个提交的后代?

有了Git,我怎么知道我的分支中的一个提交是否是另一个提交的后代呢?

如果你想以编程方式检查(例如在脚本中),你可以检查git merge-base AB是否等于git rev-parse --verify A (然后A可以从B到达),或者如果是git rev-parse --verify B (然后B可从A到达)。 git rev-parse在这里需要从提交名称转换为提交SHA-1 / commit id。

在VonC中使用git rev-list也是可能的。


如果你提到的一个提交是分支提示 ,那么git branch --contains <commit>git branch --merged <commit>可能是更好的非编程解决scheme。

从Git 1.8.0开始,作为merge-base一个选项支持:

 git merge-base --is-ancestor <maybe-ancestor-commit> <descendant-commit> 

从手册页:

–is始祖

检查第一个是否是第二个祖先,如果为true,则退出状态0,否则退出状态1。 错误通过不为1的非零状态来表示。

例如:

 git merge-base --is-ancestor origin/master master; echo $? 

这种操作依赖于在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 

如果AB到达,则以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是提交abc123的祖先,则会产生一行输出,否则不输出。

通常你可以省略“–pretty”参数,但是如果你想确保你只通过实际的提交哈希来search,而不是通过日志注释等等。

https://stackoverflow.com/a/13526591/895245提到它,现在让它更人性化:;

 git-is-ancestor() ( if git merge-base --is-ancestor "$1" "$2"; then echo 'ancestor' elif git merge-base --is-ancestor "$2" "$1"; then echo 'descendant' else echo 'unrelated' fi ) alias giia='git-is-ancestor' 

git show-branch branch-sha1 commit-sha1

哪里:

  • branch-sha1:你想要检查的分支中的sha1
  • commit-sha1:你想检查的提交sha1

build立在itub的答案上,以防需要对存储库中的所有标签执行此操作:

 for i in `git tag` ; do echo -ne $i "\t" ; git log --pretty=format:%H $i | (grep <commit to find> || echo ""); done