如何判断一个提交是否是另一个提交的后代?
有了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 
 如果A从B到达,则以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