使用 Git,我如何确定我的分支中的一个提交是否是另一个提交的后代?
从 Git 1.8.0 开始,这被支持作为 merge-base
的一个选项:
git merge-base --is-ancestor <maybe-ancestor-commit> <descendant-commit>
从man手册中得知:
--is-ancestor
检查第一个提交是否为第二个提交的祖先,如果是则以状态0退出,否则以状态1退出。错误由非1的非零状态发出信号。
例如:
git merge-base --is-ancestor origin/master master; echo $?
git merge-base THING --is-ancestor OF_THING && echo yes || echo no
例如:
git merge-base my-feature-branch --is-ancestor master && echo yes || echo no
- user1735594git merge-base --is-ancestor -- commit commit
在我的电脑上使用 git
2.1.4 (Debian/Devuan 7.10 jessie) 和 1.9.1 (Ubuntu 14.04 trusty) 的哈希值都可以正常工作,这些版本已经相当古老了。即使在 Debian wheezy 上也可以使用,只需执行 sudo apt-get install git/wheezy-backports
即可。 - Tinoecho yes || echo no
就不返回任何内容? - xr280xrgit merge-base A B
是否等于git rev-parse --verify A
(然后A可从B到达),或者它是否为git rev-parse --verify B
(则B可从A到达)。此处需要使用git rev-parse
将提交名称转换为提交SHA-1 /提交ID。git rev-list
也是一种可能性。
编辑:在现代Git中,有明确支持这个查询的形式: git merge-base --is-ancestor
。git branch --contains <commit>
或git branch --merged <commit>
可能是更好的非程序化解决方案。git checkout -b quickcheck <more-recent-commit-ID>
然后 git branch --contains <older-commit-ID>
(然后使用 git branch -D quickcheck
来删除临时分支)。 - cleegit merge-base --is-ancestor
出现之前2年发布的。 该回答比较早,在Git 1.8.0以及使用git merge-base --is-ancestor
命令之前2年就已经存在了。尽管如此,MattR的回答更好一些。 - Jakub Narębskigit branch --contains <commit>
和 git merge-base --is-ancestor ...
的速度:前者需要 3 分 40 秒,而后者只需要 0.14 秒。 - hagello这种操作依赖于在SO问题中详细说明的“git log origin/master vs 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
如果从B
可达A
,则以A
结束。
与以下语句等价:
git rev-list --boundary B --not A
假设使用B
作为正面参考,A
是负面参考。
它将从B
开始,并倒推回图形,直到遇到可从A
到达的修订版本为止。
我认为如果A
直接可达B
,它会遇到(并显示,因为有--boundary
选项)A
本身。
-
表示这是一个边界提交。我已经编辑了答案,以使其更清晰,并刷新了文档链接并纠正了这个五年前答案中的拼写错误。 - VonC另一种方法是使用 git log
和 grep
。
git log --pretty=format:%H abc123 | grep def456
如果提交def456是提交abc123的祖先,则此命令将生成一行输出,否则不会输出任何内容。--pretty
参数,但如果您想确保只搜索实际提交哈希而不是日志注释等信息,则需要该参数。--oneline
代替--pretty
:git log --oneline ce2ee3d | grep ec219cc
,效果很好。 - genshttps://dev59.com/aXA75IYBdhLWcg3w9-Sx#13526591提到了这个,现在让我们更人性化一些:
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 merge-base --is-ancestor
,请确保使用 Git 2.28(2020年第三季度)。abhishekkumar2718
)提交。gitster
--于2020年7月6日合并至提交 d80bea4)
commit-graph
: 引入commit_graph_data_slab
签署者:Abhishek Kumar
结构体“commit”在许多上下文中使用。但是,成员“generation”和“graph_pos”仅用于与提交图形相关的操作,并且浪费内存。git show-branch branch-sha1 commit-sha1
其中:
for i in `git tag` ; do echo -ne $i "\t" ; git log --pretty=format:%H $i | (grep <commit to find> || echo ""); done