有没有办法在 git 中重新进行合并?

有没有办法在 git 中重新进行合并?

所以我犯了一个相当大的错误。我提交了代码,拉取了代码,合并了代码(但这样做时代码被搞乱了),然后推送了代码。我想重新合并代码,让代码正确。有什么办法吗?

我使用 bitbucket。

答案1

不确定这是否是“幸运”的做法,但这是我解决同样问题的方法,无需“强制推动”或任何类似的粗暴做法。

让我们假设你的历史记录看起来像这样(并且 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

就这样!您已成功重新完成合并,且没有使任何历史记录无效!

答案2

你可以这样做:

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

那是:

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

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

答案3

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

答案4

我有一个不同的、稍微更复杂的设置。

基本上有三个起点:(其他解决方案都假设 1 或 2)

  1. redo-branch应该完全合并,并且
    合并redo-branch没有其他合并
  2. redo-branch应该完全合并,并且
    合并后redo-branch已经存在其他合并,应该保留
  3. redo-branch长寿枝重复合并 AND
    只有一定范围的修订曾是合并的一部分还有
    主干上的其他提交/合并合并失败后(哎哟

(3)的设置如下

---A--B--C--M   (master points here)
  /        /
-X--D-----E--Y  (that's the long-living redo-branch)
  1. 你应该对解决方案感到满意https://superuser.com/a/691497/308385
  2. 与 1 相同的解决方案可能有效
  3. 让我们开始吧 :-)
# let's start on the last commit before the failed merge
git checkout redo-branch
git checkout -b D^1 new-branch-for-merge

# now let's pick all the revisions D through E
git cherry-pick D^1..E

# go to the target branch (master) and merge
git checkout master
git merge new-branch-for-merge

相关内容