我有许多分支,它们会定期合并,即我们可以有A,它合并到B,然后B合并到C,然后A转换成D,D转换成C等等。假设我有一个提交X,我知道最初是在A中引入的,然后以某种方式合并到C中(当我执行git log C时我可以看到它)。有没有办法找出哪个合并(哪个合并提交)将提交X带入分支C?
答案 0 :(得分:5)
通常我会做以下事情:
git log --oneline --ancestry-path --merges <commit-of-interest>..C
--ancestry-path
参数是关键点:它使git只显示既是<commit-of-interest>
的后代又是C
的祖先的提交。 --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
总是在右边绘制第二个父边。)