仅使用git-restore<commit_hash>是行不通的。显然,必须指定-m。
当前回答
我从这个链接找到了如何恢复合并的很好的解释,我复制粘贴了下面的解释,如果下面的链接不起作用,这将很有帮助。
如何还原错误合并艾伦(alan@clueserver.org)他说:
我有一个主分支。我们有一个分支开发人员正在进行工作。他们声称它已经准备好了。我们将其合并进入主分支。它打破了一些东西,所以我们恢复合并。他们对代码进行更改。他们会说没关系,我们再次合并。当检查时,我们发现在还原之前所做的代码更改不在主分支中,但之后的代码更改位于主分支中树枝并请求帮助从这种情况中恢复过来。
“恢复合并”后的历史记录如下所示:
---o---o---o---M---x---x---W
/
---A---B
其中A和B处于不太好的侧开发中,M是将这些过早的更改引入主线的合并,x是与侧分支在主线上所做的和已经做的更改无关的更改,W是“合并M的恢复”(W看起来不是M颠倒了吗?)。IOW,“diff W^..W”类似于“diff-R M^..M”。
合并的“还原”可以通过以下方式进行:
$git还原-m 1 m在分支的开发人员纠正错误后,历史可能如下:
---o---o---o---M---x---x---W---x
/
---A---B-------------------C---D
其中C和D将修复A和B中的损坏,并且您可能已经在W之后的主线上进行了一些其他更改。
如果您合并更新后的分支(顶端有D),那么在A或B中所做的任何更改都不会产生结果,因为它们被W还原。这就是Alan看到的。
Linus解释了情况:
恢复常规提交只会有效地撤消该提交确实如此,而且相当简单。但同时恢复合并提交撤消提交更改的数据,但它确实与合并对历史的影响无关。因此,合并仍将存在,并且仍将被视为加入这两个分支合并在一起,将来的合并将看到最后一个共享状态-以及还原合并带来的还原不会影响这一点。因此,“还原”可以撤消数据更改,但它在很大程度上不是“撤销”是指它不会撤销提交对存储库历史记录。所以,如果你把“恢复”看作“撤消”,那么你将永远错过了这部分回复。是的,它撤销了数据,但不,它没有撤消历史记录。在这种情况下,您需要首先还原上一个还原,这将使历史看起来像这样:
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
其中Y是W的回复。这种“回复回复”可以通过以下方式完成:
$git还原W这段历史(忽略W和W..Y之间可能发生的冲突)相当于历史中根本没有W或Y:
---o---o---o---M---x---x-------x----
/
---A---B-------------------C---D
并且再次合并侧分支将不具有由较早的恢复和恢复的恢复引起的冲突。
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
当然,在C和D中所做的更改仍然可能与任何x所做的操作发生冲突,但这只是正常的合并冲突。
其他回答
如果您希望恢复刚才所做的更改,这是一个非常简单的答案:
commit 446sjb1uznnmaownlaybiosqwbs278q87
Merge: 123jshc 90asaf
git revert -m 2 446sjb1uznnmaownlaybiosqwbs278q87 //does the work
Ben已经告诉过您如何恢复合并提交,但您必须意识到这样做非常重要
“…声明您永远不希望合并带来的树更改。因此,以后的合并只会带来由不是先前还原的合并的祖先的提交引入的树更改,这可能是您想要的,也可能不是您想要的。”(git merge手册页)。
从手册页链接的文章/邮件列表消息详细说明了所涉及的机制和注意事项。只需确保您理解,如果您恢复合并提交,您不能只是稍后再次合并分支并期望相同的更改返回。
我从这个链接找到了如何恢复合并的很好的解释,我复制粘贴了下面的解释,如果下面的链接不起作用,这将很有帮助。
如何还原错误合并艾伦(alan@clueserver.org)他说:
我有一个主分支。我们有一个分支开发人员正在进行工作。他们声称它已经准备好了。我们将其合并进入主分支。它打破了一些东西,所以我们恢复合并。他们对代码进行更改。他们会说没关系,我们再次合并。当检查时,我们发现在还原之前所做的代码更改不在主分支中,但之后的代码更改位于主分支中树枝并请求帮助从这种情况中恢复过来。
“恢复合并”后的历史记录如下所示:
---o---o---o---M---x---x---W
/
---A---B
其中A和B处于不太好的侧开发中,M是将这些过早的更改引入主线的合并,x是与侧分支在主线上所做的和已经做的更改无关的更改,W是“合并M的恢复”(W看起来不是M颠倒了吗?)。IOW,“diff W^..W”类似于“diff-R M^..M”。
合并的“还原”可以通过以下方式进行:
$git还原-m 1 m在分支的开发人员纠正错误后,历史可能如下:
---o---o---o---M---x---x---W---x
/
---A---B-------------------C---D
其中C和D将修复A和B中的损坏,并且您可能已经在W之后的主线上进行了一些其他更改。
如果您合并更新后的分支(顶端有D),那么在A或B中所做的任何更改都不会产生结果,因为它们被W还原。这就是Alan看到的。
Linus解释了情况:
恢复常规提交只会有效地撤消该提交确实如此,而且相当简单。但同时恢复合并提交撤消提交更改的数据,但它确实与合并对历史的影响无关。因此,合并仍将存在,并且仍将被视为加入这两个分支合并在一起,将来的合并将看到最后一个共享状态-以及还原合并带来的还原不会影响这一点。因此,“还原”可以撤消数据更改,但它在很大程度上不是“撤销”是指它不会撤销提交对存储库历史记录。所以,如果你把“恢复”看作“撤消”,那么你将永远错过了这部分回复。是的,它撤销了数据,但不,它没有撤消历史记录。在这种情况下,您需要首先还原上一个还原,这将使历史看起来像这样:
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
其中Y是W的回复。这种“回复回复”可以通过以下方式完成:
$git还原W这段历史(忽略W和W..Y之间可能发生的冲突)相当于历史中根本没有W或Y:
---o---o---o---M---x---x-------x----
/
---A---B-------------------C---D
并且再次合并侧分支将不具有由较早的恢复和恢复的恢复引起的冲突。
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
当然,在C和D中所做的更改仍然可能与任何x所做的操作发生冲突,但这只是正常的合并冲突。
-m1是被修复的当前分支的最后一个父级,-m2是合并到其中的分支的原始父级。
如果命令行令人困惑,Tortoise Git也可以在这里提供帮助。
如果您想恢复合并提交,以下是您必须执行的操作。
首先,检查git日志以查找合并提交的id。您还可以找到与合并关联的多个父id(参见下图)。
记下黄色显示的合并提交id。父ID是在下一行中作为“合并:parent1 parent2”写入的ID。现在
短篇故事:
切换到进行合并的分支。然后,只需执行git-restore<mergecommit-id>-m1,它将打开vi控制台以输入提交消息。写,保存,退出,完成!
长话短说:
切换到进行合并的分支。在我的例子中,它是测试分支,我试图从中删除feature/analytics-v3分支。git-restore是还原任何提交的命令。但在恢复合并提交时有一个令人讨厌的技巧。您需要输入-m标志,否则它将失败。从这里开始,您需要决定是否要还原分支,并通过以下方式使其看起来与parent1或parent2完全相同:
git revert<merge commit id>-m 1(还原为parent2)
git revert<merge commit id>-m 2(还原为parent1)
你可以把这些父母记录下来,看看你想走哪条路,这是所有困惑的根源。
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别