回滚Git合并

cgm*_*ver 165 git

develop branch
--> dashboard (working branch)
Run Code Online (Sandbox Code Playgroud)

git merge --no-ff develop用来将任何上游更改合并到仪表板中

git日志:

commit 88113a64a21bf8a51409ee2a1321442fd08db705
Merge: 981bc20 888a557
Author: XXXX <>
Date:   Mon Jul 30 08:16:46 2012 -0500

    Merge branch 'develop' into dashboard

commit 888a5572428a372f15a52106b8d74ff910493f01
Author: root <root@magneto.giveforward.com>
Date:   Sun Jul 29 10:49:21 2012 -0500

    fixed end date edit display to have leading 0

commit 167ad941726c876349bfa445873bdcd475eb8cd8
Author: XXXX <>
Date:   Sun Jul 29 09:13:24 2012 -0500
Run Code Online (Sandbox Code Playgroud)

合并中有大约50多个提交,我想知道如何恢复合并,以便仪表板回到合并前的状态

第二部分是,如果我没有合并--no-ff,我没有得到提交' 合并分支'开发'到仪表板 '..我怎么会回滚合并?

Chr*_*her 250

其他问题中已经详尽地介绍了还原合并提交.当您执行快进合并时,您描述的第二个合并,您可以git reset用来恢复到以前的状态:

git reset --hard <commit_before_merge>
Run Code Online (Sandbox Code Playgroud)

你可以找到<commit_before_merge>with git reflog,git log或者,如果你感觉到了moxy(并且没有做任何其他事情):git reset --hard HEAD@{1}

  • 感谢快速回复..看看git log,合并之前的提交是50+提交回来,因为git merge develop实际上放入了所有其他提交.我想我得到的是,如果我不知道合并是什么/哪里 - 我怎么找到它?你提到找到commit_before_merge ..我想我不理解那部分 (6认同)
  • 看起来像git reflog看起来很好地总结了最后的头,并让我知道我需要重置的位置.git log似乎有太多的粒度来精确定位要重置的位置.谢谢 (4认同)
  • 将推送到远程该怎么办?我不知道它将如何工作。 (3认同)
  • 这是没有希望的。合并后它将销毁所有提交。 (2认同)

stu*_*kad 104

从这里:

http://www.christianengvall.se/undo-pushed-merge-git/

git revert -m 1 <merge commit hash>
Run Code Online (Sandbox Code Playgroud)

Git revert添加了一个回滚指定提交的新提交.

使用-m 1告诉它这是一个合并,我们想回滚到主分支上的父提交.您可以使用-m 2指定develop分支.

  • 请注意,在此之后您无法重新合并分支,因为文档说:"恢复合并提交声明您永远不会希望合并带来的树更改.因此,以后的合并将只会引入树更改通过不是先前恢复合并的祖先的提交.这可能是也可能不是你想要的." (21认同)
  • @DaliborKarlović这句话有点苛刻.您肯定可以在以后恢复这些更改,诀窍是还原恢复提交.更多信息[这里](https://git-scm.com/blog/2010/03/02/undoing-merges.html)"还原恢复"部分 (14认同)
  • 撤消合并内容已移至[此处](https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_undoing_merges) (5认同)
  • 可悲的是,@ Hilikus注释中的“这里”链接不再有效。该网站声称内容已移至一本书(https://git-scm.com/book/en/v2),但如果是这样,在其中查找内容并非易事。 (2认同)

Nic*_*rth 19

只需重置合并提交git reset --hard HEAD^.

如果你使用--no-ff git总是创建一个合并,即使你没有在它们之间提交任何东西.没有--no-ff git只会执行快进,这意味着你的分支HEAD将被设置为合并分支的HEAD.要解决此问题,请找到要还原到的commit-id和git reset --hard $COMMITID.

  • 如果不需要的合并已经提交到远程,我在恢复后使用 **git push -f** 来更新远程分支。 (3认同)
  • 如果您不知道合并前的提交,那么很好的解决方案。 (2认同)

Jor*_*nel 7

git reset -m 1 88113a64a21bf8a51409ee2a1321442fd08db705

git revert -m 1 88113a64a21bf8a51409ee2a1321442fd08db705
Run Code Online (Sandbox Code Playgroud)

但是可能会有意想不到的副作用。请参阅git-scm.com/docs/git-revert中的--mainline parent-number选项

也许一种蛮有用但有效的方法是检出该提交的左父项,制作所有文件的副本,HEAD再次检出,然后用旧文件替换所有内容。然后git会告诉您正在回滚的内容,然后您创建自己的还原提交:)!

  • 这是你说的副作用吗?`恢复合并提交声明您永远不希望合并带来的树更改。因此,稍后的合并只会带来由不是先前恢复的合并的祖先的提交引入的树更改。这可能是也可能不是您想要的。` (3认同)
  • 请注意,git reset没有-m标志。另请注意,@ JorgeOrpinel引用git-revert文档,而不是git-reset。我认为他的意思是说`git revert`而不是`git reset` (2认同)

Roh*_*Tak 5

如果您合并了分支,则使用拉取请求恢复合并,并合并该拉取请求以恢复。

我觉得最简单的方法是:

  1. 从develop/master(你合并的地方)取出一个新分支
  2. git revert -m 1 xxxxxx使用(如果使用分支合并恢复)或使用(git revert xxxxxx如果它是简单的恢复)来恢复“恢复”
  3. 新分支现在应该包含您想要再次合并的更改。
  4. 进行更改或合并此分支以开发/掌握