为什么此还原失败?

时间:2019-06-10 07:08:36

标签: git git-branch git-merge git-revert

在尝试还原不是分支上最新提交的提交时,我遇到了以下消息:

error: commit fce9354*** is a merge but no -m option was given.
fatal: revert failed

这是尝试进行还原之前分支的git log

C:\git\manager [feature/revert]> gl -n15 --oneline
a81945f (HEAD -> feature/revert, origin/develop, develop) Merge branch 'develop' of https://xyz/manager into develop
60cf3e5 Merge branch '***' into develop
b94fc85 Merge branch '***' into develop
9d81bc6 (origin/***) Accept 
48b318d (origin/***) Accept 
6f57592 ***
d823f1f (origin/***) removed 
854887b *** merged
0ebef20 added 
fce9354 Merged PR 12345: Add 
90f2b0f (origin/***) Add 
c859184 Merge branch '***' into develop
a1afdb3 Change 
fb48628 added 
2641680 added 
C:\git\manager [feature/revert]> git revert fce9354
error: commit fce9354*** is a merge but no -m option was given.
fatal: revert failed

我知道revert本质上是为撤消先前的提交而创建的新提交。

-m标志的git revert documentation状态:

  

通常您无法还原合并,因为您不知道哪一方   合并的内容应视为主线。此选项指定   主线的父编号(从1开始),并允许还原   相对于指定的父项撤消更改。

如何找到应该为-m标志提供的值?

我只想删除表示分支合并到develop分支中的提交,以便我可以修复分支并创建以后的合并,该合并将分支中的所有内容重新引入develop 。即:我不想阻止分支上先前的更改稍后合并到develop中。

是否有更简单的方法来撤消上一次提交的更改?

1 个答案:

答案 0 :(得分:3)

典型的合并提交将在git log命令输出中显示如下。

commit dddfd0b6d529bfcdcd6515555ea1dcf186fe338
Merge: 6b5619b 40ad694
Author: Raja Anbazhagan <raja.anbazhagan@example.com>
Date:   Fri Jun 7 03:11:23 2019 +0530

    Merge branch 'xyz' into 'develop'

在这里,您可以看到第二行包含两个短哈希。 6b5619b40ad694。这两个都是合并分支中最重要的提交。

这里6b5619b是分支develop的最高提交ID。并且40ad694是功能分支xyz的最高提交。

我之所以告诉你所有这一切,是因为此信息对于我接下来要解释的内容很重要。

当您重置或还原提交时,它将通过将其与其祖先提交进行比较来尝试找出该提交中发生了什么更改。

在这种情况下,有两个祖先6b5619b40ad694,GIT现在不确定要从哪个祖先那里找到差异。

在这些情况下,用户将必须提供适当的父提交ID,才能继续该过程。这是通过标志-m后跟一个序号来完成的,该序号代表父提交ID在合并提交中的位置。

对于我的示例合并提交,可能的-m值是1和2。6b5619b的值为1,40ad694的值为2。

因此,如果您想在自己的开发分支上还原代码,则应该这样做

git revert -m 1 <merge-commit>

使用-m 1进行git还原与开发分支(合并的第一个父级)相关。传递-m 2将导致与功能分支xxx相关的还原发生

通常情况下,-m 1是您应该使用的那个。但这并非在所有情况下都是如此。