git:找到哪个合并通过提交到当前分支

时间:2012-07-07 01:04:46

标签: git git-merge

我有许多分支,它们会定期合并,即我们可以有A,它合并到B,然后B合并到C,然后A转换成D,D转换成C等等。假设我有一个提交X,我知道最初是在A中引入的,然后以某种方式合并到C中(当我执行git log C时我可以看到它)。有没有办法找出哪个合并(哪个合并提交)将提交X带入分支C?

1 个答案:

答案 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总是在右边绘制第二个父边。)