git - 为什么这个恢复失败了?

标签 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 本质上是创建一个新的提交来撤销之前的提交。

git revert documentation对于 -m 标志状态:

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 标志的值?

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

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

最佳答案

典型的 merge 提交将在 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。这两个都是 merge 的分支中最重要的提交。

此处 6b5619b 是分支 develop 的最高提交 ID。 40ad694 是功能分支 xyz 的最高提交。

我告诉你这一切是因为这些信息对我接下来要解释的内容很重要。

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

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

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

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

所以如果你想在你的开发分支上恢复你的代码,你应该这样做

git revert -m 1 <merge-commit>

使用 -m 1 时,git revert 与开发分支( merge 的第一个父级)相关。传递 -m 2 将导致与功能分支 xxx

相关的还原发生

在一般情况下,-m 1 是您应该使用的。但这并非适用于所有情况。

关于git - 为什么这个恢复失败了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56521974/

相关文章:

git - 限制 git svn 到分支

Git 提交未完成 merge

git - 如何在不妨碍我的团队的情况下重命名根项目文件夹?

ruby-on-rails - "modified: Gemfile.lock",为什么?

git - Git:如何将现有的 `merge`转换为 `merge --squash`?

git - 术语 "porcelain"在 Git 中是什么意思?

git - git 有什么了不起的?

git - Gerrit change-merged Hook

git - 使用 Git (Dreamhost) 部署站点不起作用

git - 如何重命名本地 Git 分支?