2

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

4

1 回答 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 回答