git:找到哪个合并brough提交到当前分支
我有一些分支,这些分支定期合并,即我们可以有A,合并到B中,然后B合并到C中,然后A合并到D和D中C等。假设我有一个提交X,我知道它最初是在A中引入的,然后以某种方式合并到C中(当我执行git log C时,我可以看到它)。有没有办法找出哪个合并(合并提交)将提交X带入分支C?git:找到哪个合并brough提交到当前分支
通常我这样做如下:
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
总是绘制右边的第二个父边)。
不幸的是,我从这里得到的是1500+行,看起来像这样: '| | | * 4b4079b合并请求#1234从用户名/ bug3456' 这不是一个很大的帮助。现在,最后一行是与我正在查找的提交合并,但是它表示何时将此提交合并到另一个分支中(最初引入的分支),但是当它进入C并进行了哪种合并时,它就会进行合并...... – StasM 2012-07-08 00:48:58
@StasM:默认合并提交信息是“合并分支'foo'”(如果将'foo'合并到'master'中)或者“合并分支'foo'到条”(如果将'foo'合并到'bar'中)。如果没有任何/很少的合并提交是这样的话,那么它可能很难 - 你可能需要编写一个脚本来过滤掉我提到的后两类合并。在我的情况下,合并提交几乎总是有默认的格式,所以grep for“into C”,并找到最后一场比赛将找到所有我使用的库的兴趣合并。 – 2012-07-08 04:56:26
太棒了,这帮助我调试了我们在这里的“过早合并”问题。非常感谢! – Stefaan 2013-10-10 10:43:26
这对git grep X有帮助吗? – 2012-07-07 01:30:43
@MichaelDurrant不知道如何git grep会有所帮助,你可以ebalorate?我无法grep文件/提交中的特定文本,因为我正在寻找的提交进行了大量小的更改,并且几乎所有其他模式也会出现在其他提交中,出现的概率很高。 – StasM 2012-07-07 04:49:03