如何判断一个提交是否是另一个提交的后代?
有了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