为啥这次回归失败了?
Posted
技术标签:
【中文标题】为啥这次回归失败了?【英文标题】:Why did this revert fail?为什么这次回归失败了? 【发布时间】:2019-10-24 14:14:35 【问题描述】:在尝试恢复我的分支上不是最新的提交时,我遇到了以下消息:
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】:典型的合并提交将在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'
在这里,您可以看到第二行包含两个短哈希。 6b5619b
和 40ad694
。这两个都是合并的分支中最多的提交。
这里6b5619b
是develop
分支的最高提交ID。而40ad694
是功能分支xyz
的最高提交。
我告诉你这一切是因为这些信息对于我接下来要解释的内容很重要。
当您重置或恢复提交时,它会通过将其与其祖先提交进行比较来尝试找出该提交中发生了什么变化。
在这种情况下,有两个祖先 6b5619b
和 40ad694
,GIT 现在不确定它必须从哪个祖先找到差异。
在这些情况下,用户必须提供适当的父提交 ID 才能继续进程。这是通过一个标志 -m 后跟一个序号来完成的,该序号表示父提交 id 在合并提交中的位置。
对于我的示例合并提交,可能的 -m 值为 1 和 2。6b5619b
为 1,40ad694
为 2。
所以如果你想在你的开发分支上恢复你的代码,你应该这样做
git revert -m 1 <merge-commit>
使用-m 1
git revert 与开发分支(合并的第一个父级)相关。传递-m 2
将导致与功能分支xxx
相关的还原发生
一般情况下,-m 1
是您应该使用的。但并非所有情况都如此。
【讨论】:
以上是关于为啥这次回归失败了?的主要内容,如果未能解决你的问题,请参考以下文章