仅使用git-restore<commit_hash>是行不通的。显然,必须指定-m。
当前回答
下面是一个完整的示例:
git revert -m 1 <commit-hash>
git push -u origin master
git还原。。。提交您的更改。
-m1表示您希望在合并之前恢复到第一个父级的树,如下面的答案所述。<commit hash>是要还原的合并的提交哈希。
git推。。。将更改推送到远程分支。
其他回答
为了保持日志的整洁(这种方法有一些缺点(由于push-f)):
git checkout <branch>
git reset --hard <commit-hash-before-merge>
git push -f origin HEAD:<remote-branch>
“合并前提交哈希”来自合并后的日志(gitlog)。
我从这个链接找到了如何恢复合并的很好的解释,我复制粘贴了下面的解释,如果下面的链接不起作用,这将很有帮助。
如何还原错误合并艾伦(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
有时,回滚的最有效方法是后退并替换。
git日志
使用第二个提交哈希(完整哈希,在列出错误之前要恢复到的哈希),然后从那里重新广播。
git checkout-b newbranch<HASH>
然后删除旧分支,将新分支复制到原来的位置,然后从那里重新启动。
git branch -D oldbranch
git checkout -b oldbranch newbranch
如果已广播,则从所有存储库中删除旧分支,将重做的分支推到最中心,然后将其拉回到所有存储库。
这是一个非常古老的线索,但我认为缺少另一个方便的解决方案:
我从不恢复合并。我只是从修订版中创建了另一个分支,其中所有内容都正常,然后从中间添加的旧分支中选择所有需要选择的内容。
因此,如果GIT历史是这样的:
dcb<<<合并一...
我从a、cherry pick c和d中创建了一个新分支,然后新分支从b中清除。我可以再次决定在新分支中合并“b”。如果不再需要“b”或“b”仍在另一个(功能/修补程序)分支中,旧分支将被弃用,并将被删除。
现在唯一的问题是计算机科学中最困难的事情之一:如何命名新分支
好的,如果你特别是在devel中失败,你可以如上所述创建newdevel,删除旧的devel并将newdevel重命名为devel。任务完成。现在,您可以在需要时再次合并更改。这就像以前从未合并过。。。。
推荐文章
- Visual Studio Code: .git文件夹/文件隐藏
- “node_modules”文件夹应该包含在git存储库中吗
- 为什么git-rebase给了我合并冲突,而我所做的只是压缩提交?
- 当我试图推到原点时,为什么Git告诉我“没有这样的远程‘原点’”?
- 如何从远程分支中挑选?
- 如何查看一个分支中的哪些提交不在另一个分支中?
- 如何取消在github上的拉请求?
- HEAD和master的区别
- GIT克隆在windows中跨本地文件系统回购
- RPC失败;卷度传输已关闭,剩余未完成的读取数据
- 我应该在.gitignore文件中添加Django迁移文件吗?
- 错误:您对以下文件的本地更改将被签出覆盖
- Git rebase—即使所有合并冲突都已解决,仍然会继续报错
- 在Git中,我如何知道我的当前版本是什么?
- 跟踪所有远程git分支作为本地分支