有没有办法在git中重做合并?


17

所以我犯了一个很大的错误。我进行了提交,拉出,合并(但同时弄乱了代码),然后进行了推送。我想重做合并并正确获取代码。有什么办法吗?

我用bitbucket。

git 

10
只是注意-这实际上是对话题的SO,并且应该不会被迁移。尝试在某些时候阅读自己的帮助页面,并记下程序员常用软件工具。就是说,SwiftCore在这里也是热门话题,不要迁移它,这并不难,这不是您的错。
鲍勃

Answers:


13

不知道这是否是“祝福”的方式,但是这就是我为解决同一问题所做的事情,而无需“强行推动”或类似的事情。

假设您的历史记录看起来像这样(M是混乱的合并):

-A--B--C--M (master points here)
  \      /
   D----E

git checkout -b merge_fix <commit ID E>在我们犯任何错误之前,运行会创建一个分支:

-A--B--C--M (master points here)
  \      /
   D----E (HEAD and merge_fix point here)

现在,让我们在新分支上重新进行合并。我们不能只是合并master,所以我们需要在错误合并之前手动选择提交:git merge <commit ID C>不要犯上次相同的错误!

-A--B--C--M (master points here)
  \      X
   D----E-G (HEAD and merge_fix point here)

假设提交G看起来不错,现在我们要与master分支的顶部同步。此命令告诉git忽略对master所做的更改,并强制我们的更改成为合并结果:git merge -s ours master

-A--B--C--M (master points here)
  \      X  \
   D----E-G--H (HEAD and merge_fix point here)

最后,(再次假设提交H看起来不错,我们想快进master包括固定的合并:

git checkout master
git merge merge_fix

这实际上只是将master分支指针移到H,但是我将借此机会稍微整理一下我的ASCII文字:

-A--B--C--M--H (HEAD, master, and merge_fix all point here)
  \      X  /
   D----E--G

在那里,您拥有了!您已成功重新完成了合并,而没有使任何历史无效!


6

您可以这样做,如下所示:

  1. 在合并之前重置为提交。
  2. 再次执行合并
  3. 推力

那是:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

请记住,这git push --force将重写您在远程分支机构中拥有的所有内容,其他使用该分支机构的人也可能会受到此影响。(通常,您不应该这样做。)


6
只记得这样做git push --force是不安全的
Zepplock

1

git merge --abort 然后您可以再次合并


我只是收到“没有要合并的内容”消息

3
仅在存在合并冲突时才能执行此操作。
chanchal118

为什么要减一?这帮助了我。
swdev

因为问题是关于何时(不正确地)完成合并并进行推送。
罗宾·格林

-1

请检查此希望对您有用

https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html

虽然这可以回答OP问题,但SO上仅接受链接答案。但是,您可以在答案中引用链接中最相关的摘录。

尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能无效。
普拉纳夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.