2012-07-07 114 views
2

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

+0

这对git grep X有帮助吗? – 2012-07-07 01:30:43

+0

@MichaelDurrant不知道如何git grep会有所帮助,你可以ebalorate?我无法grep文件/提交中的特定文本,因为我正在寻找的提交进行了大量小的更改,并且几乎所有其他模式也会出现在其他提交中,出现的概率很高。 – StasM 2012-07-07 04:49:03

回答

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>

第一类是你感兴趣的一个。你可以n通常通过查看提交主题行来确定合并的类别。从列表底部开始;最古老的合并最有可能属于第一类。

技术上可以编写一个脚本来过滤掉第二和第三类中的合并(只需测试合并的第一个父代是否可以访问<commit-of-interest>),但我从未发现它是必需的。

如果您需要做的提交历史更深入的研究那么我建议在看历史图:

git log --oneline --graph --color --decorate \ 
    --ancestry-path <commit-of-interest>..C 

您可能希望在--boundary折腾过,虽然有时候,增加了太多噪声。您可以使用gitk,但不幸的是,它绘制的图不会以正确的顺序显示父项(gitk可能会在合并和其左边的第二个父项之间绘制边缘; git log --graph总是绘制右边的第二个父边)。

+1

不幸的是,我从这里得到的是1500+行,看起来像这样: '| | | * 4b4079b合并请求#1234从用户名/ bug3456' 这不是一个很大的帮助。现在,最后一行是与我正在查找的提交合并,但是它表示何时将此提交合并到另一个分支中(最初引入的分支),但是当它进入C并进行了哪种合并时,它就会进行合并...... – StasM 2012-07-08 00:48:58

+0

@StasM:默认合并提交信息是“合并分支'foo'”(如果将'foo'合并到'master'中)或者“合并分支'foo'到条”(如果将'foo'合并到'bar'中)。如果没有任何/很少的合并提交是这样的话,那么它可能很难 - 你可能需要编写一个脚本来过滤掉我提到的后两类合并。在我的情况下,合并提交几乎总是有默认的格式,所以grep for“into C”,并找到最后一场比赛将找到所有我使用的库的兴趣合并。 – 2012-07-08 04:56:26

+0

太棒了,这帮助我调试了我们在这里的“过早合并”问题。非常感谢! – Stefaan 2013-10-10 10:43:26