所以我犯了一个相当大的错误。我提交了代码,拉取了代码,合并了代码(但这样做时代码被搞乱了),然后推送了代码。我想重新合并代码,让代码正确。有什么办法吗?
我使用 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
你可以这样做:
- 重置为合并之前的提交。
- 再次执行合并
- 强制推送
那是:
git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
请记住,这git push --force
将重写您在远程分支上的任何内容,并且使用该分支的其他人也可能会受到影响。(通常您不应该这样做。)
答案3
git merge --abort
然后你可以再次合并
答案4
我有一个不同的、稍微更复杂的设置。
基本上有三个起点:(其他解决方案都假设 1 或 2)
redo-branch
应该完全合并,并且
合并redo-branch
后没有其他合并redo-branch
应该完全合并,并且
合并后redo-branch
已经存在其他合并,应该保留redo-branch
是长寿枝重复合并 AND
只有一定范围的修订曾是合并的一部分还有
主干上的其他提交/合并合并失败后(哎哟)
(3)的设置如下
---A--B--C--M (master points here)
/ /
-X--D-----E--Y (that's the long-living redo-branch)
- 你应该对解决方案感到满意https://superuser.com/a/691497/308385
- 与 1 相同的解决方案可能有效
- 让我们开始吧 :-)
# 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