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


当前回答

当您在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

采取备份分支

git checkout -b mybackup-brach

git reset --hard 8989ee0 
git push origin -u mybackup-branch

所以现在您在合并之前进行了更改,如果一切正常,请签入上一个分支并用备份分支重置

git reset --hard origin/mybakcup-branhc

其他回答

Ben已经告诉过您如何恢复合并提交,但您必须意识到这样做非常重要

“…声明您永远不希望合并带来的树更改。因此,以后的合并只会带来由不是先前还原的合并的祖先的提交引入的树更改,这可能是您想要的,也可能不是您想要的。”(git merge手册页)。

从手册页链接的文章/邮件列表消息详细说明了所涉及的机制和注意事项。只需确保您理解,如果您恢复合并提交,您不能只是稍后再次合并分支并期望相同的更改返回。

git revert -m 1 <merge-commit>

当您在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

采取备份分支

git checkout -b mybackup-brach

git reset --hard 8989ee0 
git push origin -u mybackup-branch

所以现在您在合并之前进行了更改,如果一切正常,请签入上一个分支并用备份分支重置

git reset --hard origin/mybakcup-branhc

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

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

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

dcb<<<合并一...

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

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

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

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

git revert -m 1 <commit-hash>

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

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