我有许多分支,它们定期合并,即我们可以有 A,它被合并到 B,然后 B 到 C,然后 A 到 D 和 D 到 C,等等。假设我有一个提交 X,我知道最初是在 A 中引入的,然后以某种方式合并到 C 中(我在执行 git log C 时可以看到)。有没有办法找出哪个合并(哪个合并提交)将提交 X 带入分支 C?
问问题
662 次
1 回答
5
通常我会执行以下操作:
git log --oneline --ancestry-path --merges <commit-of-interest>..C
参数是这里的关键:它导致 git 只显示--ancestry-path
既是. 该选项进一步过滤结果列表以仅显示合并提交。<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
总是在右侧绘制第二个父级边缘)。
于 2012-07-07T16:42:28.527 回答