Mat*_*t W 6 git git-merge git-revert git-branch
在尝试恢复不是我的分支上最新的提交时,我遇到了以下消息:
error: commit fce9354*** is a merge but no -m option was given.
fatal: revert failed
Run Code Online (Sandbox Code Playgroud)
这是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
Run Code Online (Sandbox Code Playgroud)
我知道 arevert本质上是为了撤消先前的提交而创建的新提交。
该标志的git revert 文档-m指出:
通常您无法恢复合并,因为您不知道合并的哪一侧应被视为主线。该选项指定主线的父编号(从 1 开始),并允许 revert 反转相对于指定父级的更改。
我怎样才能找到我应该提供给标志的值-m?
我只想删除代表分支合并到develop分支中的提交,以便我可以修复分支并创建稍后的合并,将分支上的所有内容引入回develop. 即:我不想阻止分支上以前的更改被合并到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'
Run Code Online (Sandbox Code Playgroud)
在这里,您可以看到第二行包含两个短哈希值。6b5619b和40ad694。这两个都是合并的分支的最顶层提交。
这6b5619b是分支最上面的提交 ID develop。并且40ad694是功能分支的最顶层提交xyz。
我告诉你这一切是因为这些信息对于我接下来要解释的内容很重要。
当您重置或恢复提交时,它将尝试通过将其与其祖先提交进行比较来找出该提交中发生了什么变化。
在这种情况下,有两个祖先6b5619b,并且40ad694GIT 现在不确定它必须从哪个祖先中找到差异。
在这些情况下,用户必须提供适当的父提交 ID 才能使进程继续。这是通过标志 -m 后跟一个序数来完成的,该序号表示父提交 ID 在合并提交中的位置。
对于我的示例合并提交,可能的 -m 值为 1 和 2。1 对于6b5619b,2 对于40ad694。
因此,如果您想在开发分支上恢复代码,您应该这样做
git revert -m 1 <merge-commit>
Run Code Online (Sandbox Code Playgroud)
git 恢复与-m 1开发分支(合并的第一个父级)相关。通过-m 2将导致与功能分支相关的恢复发生xxx
一般情况下-m 1您应该使用它。但并非所有情况都是如此。