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

22 git

所以我犯了一个很大的错误。我提交、拉取、合并(但在这样做时弄乱了代码)然后推送。我想重做合并并获得正确的代码。有没有办法做到这一点?

我使用比特桶。

mbl*_*the 19

不确定这是否是“有福的”方式来做到这一点,但这是我为解决同样的问题所做的,而不必“强行推动”或任何类似的事情。

让我们假设你的历史看起来像这样(M 是失败的合并):

-A--B--C--M (master points here)
  \      /
   D----E
Run Code Online (Sandbox Code Playgroud)

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

-A--B--C--M (master points here)
  \      /
   D----E (HEAD and merge_fix point here)
Run Code Online (Sandbox Code Playgroud)

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

-A--B--C--M (master points here)
  \      X
   D----E-G (HEAD and merge_fix point here)
Run Code Online (Sandbox Code Playgroud)

假设提交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)
Run Code Online (Sandbox Code Playgroud)

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

git checkout master
git merge merge_fix
Run Code Online (Sandbox Code Playgroud)

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

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

你有它!您已经成功地重新完成了合并,而没有使任何历史记录失效!


jan*_*nos 6

你可以这样做,就像这样:

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

那是:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
Run Code Online (Sandbox Code Playgroud)

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

  • 只要记住做```git push --force``` 是不安全的 (6认同)

Zep*_*ock 3

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

  • 仅当存在合并冲突时才能执行此操作。 (3认同)