确定哪个合并提交导致特定提交合并到我的分支中

Posted

技术标签:

【中文标题】确定哪个合并提交导致特定提交合并到我的分支中【英文标题】:determining which merge commit caused a specific commit to be merged into my branch 【发布时间】:2014-01-22 05:25:42 【问题描述】:

鉴于以下历史:

master  A-B-C-D-E-F
             \
topic         G-H-I

我可以使用什么 git 命令来确定 C 导致 G 被合并到 master 中?

换一种说法,忽略分支名称:“如何确定是哪个合并提交导致 A 在其祖先中有 G?”

【问题讨论】:

请注意,任何对此的编程解决方案都必须依赖于 master 仅被合并到并且从未重置或重写的事实,因为 Git 不会跟踪哪个分支作出了承诺。 (即没有通用的解决方案) Nevik,以另一种方式问,“我如何确定哪个合并提交导致 A 在其祖先中有 G?”忘记分支名称。 【参考方案1】:

git merge-base G master 给出共同祖先:

Find common ancestor of two git branches

我认为这回答了您的第一个表述,但当您说“C 导致 G 合并到 master”时,我可能不明白您的意思。

【讨论】:

这报告 G 在我的情况下。我正在寻找可以报告 C 的内容。【参考方案2】:

您可以从第一次提交及时向前走,直到您遇到可以到达抢手提交的合并提交。通过将 walk 设为 first-parent walk,我们忽略了发生在侧分支中的所有提交。

使用How can I tell if one commit is a descendant of another commit? 中描述的可达性测试,以下示例找到将wanted 环境变量的内容标识的提交引入到主分支的第一个合并提交:

for c in $(git rev-list --reverse --first-parent --merges master) ; do
  test $(git merge-base $wanted $c) = $wanted && echo $c && break
done

对于 Git 1.8.0 及更高版本,新的 --is-ancestor 选项可以稍微缩短命令:

for c in $(git rev-list --reverse --first-parent --merges master) ; do
  git merge-base --is-ancestor $wanted $c && echo $c && break
done

【讨论】:

以上是关于确定哪个合并提交导致特定提交合并到我的分支中的主要内容,如果未能解决你的问题,请参考以下文章

撤消 Git 分支提交和合并

合并我的分支中只有一个提交包含的更改? [复制]

从已推送的合并分支中恢复特定提交

执行合并后在两个分支中同时提交

git合并分支时禁止合并特定文件

如何撤消合并请求及其提交?