我有许多分支,它们会定期合并,即我们可以将 A 合并到 B 中,然后将 B 合并到 C 中,然后将 A 合并到 D 中,然后将 D 合并到 C 中,等等。假设我有一个提交 X,我知道它最初是在A中引入的,然后以某种方式合并到C中(我在执行git log C时可以看到它)。有没有办法找出哪个合并(哪个合并提交)将提交X带入分支C?
通常我会做类似以下的事情:
git log --oneline --ancestry-path --merges <commit-of-interest>..C
The --ancestry-path
参数是这里的关键:它导致 git 只显示都是以下子代的提交<commit-of-interest>
和一个祖先C
. The --merges
选项进一步过滤结果列表以仅显示合并提交。
每个打印的合并都属于以下类别之一:
- 合并带来了
<commit-of-interest>
进入一个分支
- 合并将不同的分支引入到已有的分支中
<commit-of-interest>
- 两个父分支都已经有
<commit-of-interest>
第一个类别是您感兴趣的类别。您通常可以通过查看提交主题行来判断合并属于哪个类别。从列表底部开始;最古老的合并最有可能属于第一类。
从技术上讲,可以编写一个脚本来过滤掉第二类和第三类中的合并(只需测试一下是否<commit-of-interest>
合并的第一个父级可以访问),但我从未发现它是必要的。
如果您需要更深入地研究提交历史记录,那么我建议您查看历史记录图:
git log --oneline --graph --color --decorate \
--ancestry-path <commit-of-interest>..C
你可能想扔进去--boundary
也是如此,尽管有时这会增加太多噪音。你可以使用gitk
,但不幸的是它绘制的图表没有以正确的顺序显示出身(gitk
可能会在合并与其左侧的第二个父级之间绘制边缘;git log --graph
始终在右侧绘制第二个父边)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)