还原合并提交时 1 和 2 的意义

Posted

技术标签:

【中文标题】还原合并提交时 1 和 2 的意义【英文标题】:Significance of 1 and 2 while reverting merge commit 【发布时间】:2017-07-06 18:58:41 【问题描述】:

我遇到了一种情况,我需要在 git 中恢复我的一个合并提交。我使用了以下命令:

git revert -m 1 [merge commit id]

现在 git 为上述命令提供了另外一种选择,如下所示:

git revert -m 2 [merge commit id]

我不明白 1 和 2 之间的区别

使用的参考:https://www.christianengvall.se/undo-pushed-merge-git/

【问题讨论】:

一次合并提交主要有 2 个父节点,数字表示要还原的父节点 【参考方案1】:

git revert 文档提供了类似的语法

git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>…​

所以这里-m后面的数字代表父编号

一个合并提交可能有两个父母说考虑一个例子,你当前的哈希是0ce2ca0b35f59af267241cf4d40d16a3e13ba6f3

并且有两个父母

df1acf5f54426d30f12c6b4558c3dd922297aae3
e19b912404ffd3c153ccac3072dbf22396896d2a

git revert -m 2 0ce2ca0b35f59af267241cf4d40d16a3e13ba6f3

将恢复为e19b912404ffd3c153ccac3072dbf22396896d2a

Documentation

【讨论】:

【参考方案2】:

一个 git 存储库只是一个提交树。合并提交只是具有两个(或更多)父级的提交。

如果您还原单个父项的提交,那么您只是撤消了该提交引入的更改。

但是,如果您要恢复合并提交,则需要恢复合并到的分支中的所有更改。但是,对于哪个分支合并到哪个分支没有真正的概念 - 您只有提交,-m 告诉 git 您要将哪个父级恢复(即撤消从另一个父级引入的更改)

在此处查看文档:https://git-scm.com/docs/git-revert#git-revert--mparent-number

【讨论】:

以上是关于还原合并提交时 1 和 2 的意义的主要内容,如果未能解决你的问题,请参考以下文章

错误:指定了主线,但提交不是合并;致命:还原失败

Git 还原一些提交(包括合并),然后稍后重新提交

如何正确地将多个合并还原为远程主控

git 开发测试分支失误合并到了master分支,怎么还原?

在合并期间忽略还原的更改

为啥还原的提交不会显示在新 PR 中?