仅使用git-restore<commit_hash>是行不通的。显然,必须指定-m。


当前回答

这是一个非常古老的线索,但我认为缺少另一个方便的解决方案:

我从不恢复合并。我只是从修订版中创建了另一个分支,其中所有内容都正常,然后从中间添加的旧分支中选择所有需要选择的内容。

因此,如果GIT历史是这样的:

dcb<<<合并一...

我从a、cherry pick c和d中创建了一个新分支,然后新分支从b中清除。我可以再次决定在新分支中合并“b”。如果不再需要“b”或“b”仍在另一个(功能/修补程序)分支中,旧分支将被弃用,并将被删除。

现在唯一的问题是计算机科学中最困难的事情之一:如何命名新分支

好的,如果你特别是在devel中失败,你可以如上所述创建newdevel,删除旧的devel并将newdevel重命名为devel。任务完成。现在,您可以在需要时再次合并更改。这就像以前从未合并过。。。。

其他回答

为了保持日志的整洁(这种方法有一些缺点(由于push-f)):

git checkout <branch>
git reset --hard <commit-hash-before-merge>
git push -f origin HEAD:<remote-branch>

“合并前提交哈希”来自合并后的日志(gitlog)。

正如Ryan所提到的,git-restore可能会使合并变得困难,因此git-restore也许不是您想要的。我发现在这里使用git reset-hard<commit hash before merge>命令更有用。

完成硬重置部分后,可以强制推送到远程分支,即git push-f<remote name><remote branch name>,其中<remote name>通常被命名为origin。从那时起,如果您愿意,可以重新合并。

-m1是被修复的当前分支的最后一个父级,-m2是合并到其中的分支的原始父级。

如果命令行令人困惑,Tortoise Git也可以在这里提供帮助。

我发现在两个已知端点之间创建一个反向补丁,然后应用该补丁即可。这假设您已经创建了主分支的快照(标记),甚至是主分支的备份,比如master_bk_011012017。

假设你合并到master的代码分支是mycodebranch。

签出主机。在主服务器和备份服务器之间创建一个完整的二进制反向修补程序。gitdiff—二进制主文件。。master_bk_01017>~/myrevert.patch检查您的补丁git apply--检查myevert.patch签署后应用修补程序git am--签出<myevert.patch如果修复后需要再次引入此代码,则需要从还原的主节点分支并签出修复分支git分支分支分支修复git校验mycodebranchfix在这里,您需要找到还原的SHA密钥并还原还原git还原现在,您可以使用mycodebranch_fix来解决问题,提交并在完成后重新合并到master中。

您可以按照以下步骤恢复不正确的提交或将远程分支重置回正确的HEAD/状态。

注意:此解决方案仅适用于您自己的分支,而不适用于共享的树枝

签出远程分支到本地回购。git签出您的branch_name从git日志中复制提交哈希(即错误提交前的提交id)git日志-n5

应该显示如下内容:

提交7cd42475d6f95f5896b6f02e902efab0b70e8038“合并分支“错误提交”到“your_branch_name”“提交”f9a734f8f44b0b37ccea769a2fd774c0f0c012“这是错误的提交”提交3779ab50e72908da92d2cfcd72256d7a09f444ba“这是正确的提交“

将分支重置为上一步中复制的提交哈希git reset<commit hash>(即3779ab50e72908da92d2cfcd72256d7a09f444ba)运行gitstatus以显示错误提交中的所有更改。只需运行gitreset——很难还原所有这些更改。强制将您的本地分支推到远程,并注意到您的提交历史记录与被污染之前一样干净。git push-f origin your_branch_name