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


当前回答

我在一个已合并到GitHub回购主分支的PR上也遇到了这个问题。

因为我只是想修改一些修改过的文件,而不是PR带来的全部更改,所以我不得不用gitcommit-am修改合并提交。

步骤:

转到要更改/还原某些已修改文件的分支根据修改的文件执行所需的更改运行git-add*或git-add<file>运行gitcommit--am并验证运行git push-f

为什么有趣:

它使公关的作者承诺保持不变它不会破坏git树您将被标记为提交人(合并提交作者将保持不变)Git就像你解决了冲突一样,它会删除/更改修改文件中的代码,就像你手动告诉GitHub不要按原样合并它一样

其他回答

在git-restore-m中,-m选项指定父编号。这是需要的,因为合并提交有多个父级,Git无法自动知道哪个父级是主线,哪个父级就是要取消合并的分支。

当您在git日志的输出中查看合并提交时,您将看到其父级列在以merge开头的行中:

commit 8f937c683929b08379097828c8a04350b9b8e183
Merge: 8989ee0 7c6b236
Author: Ben James <ben@example.com>
Date:   Wed Aug 17 22:49:41 2011 +0100

Merge branch 'gh-pages'

Conflicts:
    README

在这种情况下,git revert 8f937c6-m 1将获得8989ee0中的树,而git rever-m 2将恢复7c6b236中的树。

为了更好地理解父ID,可以运行:

git log 8989ee0 

and

git log 7c6b236

所有的答案已经涵盖了大部分内容,但我还要加上我的5美分。简而言之,恢复合并提交非常简单:

git revert -m 1 <commit-hash>

如果您有权限,可以将其直接推送到“主”分支,否则只需将其推送到“还原”分支并创建拉取请求。

您可以在此处找到有关此主题的更多有用信息:https://itcodehub.blogspot.com/2019/06/how-to-revert-merge-in-git.html

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

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

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

git文档关于git revert-m提供了一个链接,准确地解释了这一点:https://github.com/git/git/blob/master/Documentation/howto/revert-a-faulty-merge.txt