为什么这个恢复失败了?

Why did this revert fail?

在尝试还原不是我分支上最新的提交时,我在这条消息中 运行:

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 状态:

Usually you cannot revert a merge because you do not know which side of the merge should be considered the mainline. This option specifies the parent number (starting from 1) of the mainline and allows revert to reverse the change relative to the specified parent.

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

我只想删除代表分支合并到 develop 分支的提交,这样我就可以修复分支并创建一个稍后的合并,将分支上的所有内容引入 [=16] =].即:我不想阻止分支上的先前更改稍后合并到 develop 中。

是否有更简单的方法来撤消先前提交的更改?

典型的合并提交将在 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 是您应该使用的。但并非所有情况都如此。