采用git merge-base --is-ancestor <commit1> <commit2>
找到答案的方法不止一种。最简单的就是使用
git merge-base --is-ancestor <possible-ancestor-commit> <commit>
从文档中git merge-base
:
--is-ancestor
检查第一个<commit>
是否是第二个的祖先,<commit>
如果为真则以状态 0 退出,否则以状态 1 退出。错误由非 1 的非零状态发出信号。
其他选项
带有三点...
符号的 git log
另一种选择是使用git log
并使用三点符号...
来告诉 Git 输出子提交的集合并集,减去集合交集。基本上,它会告诉您一组提交是如何相互分歧的:
$ git log --oneline --graph --left-right \
--first-parent --decorate <commit1>...<commit2>
上述命令将向您显示可从commit1
或访问的提交commit2
,但不能同时访问,即 C1 UNION C2 - C1 INTERSECTION C2,就设置操作而言。
如果两个提交都不是另一个提交的父提交,您将看到两者的子提交,但如果一个提交是另一个提交的祖先,则您只会看到后代提交的输出,因为祖先包含在路径中的后代,因此被排除在输出之外。
您可以git log
从以下资源中了解更多关于三点符号的信息:
- 混帐日志(1)。
- gitrevisions(1):指定范围。
- 修订选择。
git branch --contains 选项
git-rev-list(1)似乎可以用来回答这个问题。另一种方法是简单地将临时分支标签附加到您要测试的提交上,然后使用以下--contains
选项git branch
:
git branch --contains <commit-to-test>
输出将是在其提交树中某处包含提交的所有分支,因此通过在另一个提交上使用临时分支,您可以查看您正在测试的提交是否是祖先。
从文档中:
--contains [<commit>]
仅列出包含指定提交的分支(如果未指定,则为 HEAD)。