仅使用git-restore<commit_hash>是行不通的。显然,必须指定-m。
当前回答
所有的答案已经涵盖了大部分内容,但我还要加上我的5美分。简而言之,恢复合并提交非常简单:
git revert -m 1 <commit-hash>
如果您有权限,可以将其直接推送到“主”分支,否则只需将其推送到“还原”分支并创建拉取请求。
您可以在此处找到有关此主题的更多有用信息:https://itcodehub.blogspot.com/2019/06/how-to-revert-merge-in-git.html
其他回答
当您在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-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
-m1是被修复的当前分支的最后一个父级,-m2是合并到其中的分支的原始父级。
如果命令行令人困惑,Tortoise Git也可以在这里提供帮助。
Ben已经告诉过您如何恢复合并提交,但您必须意识到这样做非常重要
“…声明您永远不希望合并带来的树更改。因此,以后的合并只会带来由不是先前还原的合并的祖先的提交引入的树更改,这可能是您想要的,也可能不是您想要的。”(git merge手册页)。
从手册页链接的文章/邮件列表消息详细说明了所涉及的机制和注意事项。只需确保您理解,如果您恢复合并提交,您不能只是稍后再次合并分支并期望相同的更改返回。
如果您希望恢复刚才所做的更改,这是一个非常简单的答案:
commit 446sjb1uznnmaownlaybiosqwbs278q87
Merge: 123jshc 90asaf
git revert -m 2 446sjb1uznnmaownlaybiosqwbs278q87 //does the work
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的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之间的区别