我正在使用几周前进行合并的存储库,我们刚刚发现它使用--strategy=ours
标志(它应该使用--strategy-option =我们的标志),因此不应用任何改为HEAD。但是,我们需要应用更改。 Git已经将分支识别为已合并以及分支历史记录中的提交。
无法使用git revert -m ...
恢复和/或重新应用合并以更改文件的正确方法是什么?
master A - B - E - F - G ---> L - M - N
\ /
topic C - D
合并提交(F)
将是此方案的罪魁祸首。
答案 0 :(得分:7)
我发现了这个问题的解决方案。 Linus写的关于恢复错误合并的信中写道:How to revert a faulty merge。
我们的案例中的git merge --strategy=ours topic
并非有意。即使它是一个错误的合并,它也无法恢复,并且长期被推动,具有与恢复合并提交相同的效果,而无法恢复恢复提交。
解决方案是签出主题分支,从第一次提交运行rebase --no-ff
,然后将该分支合并回master。
git checkout topic
git rebase -i --no-ff <C>
git checkout master
git merge topic
这具有屈服的效果:
fixed–topic C'–––D'––––––––––––––––––––-
/ \
master A–––B–––E–––F–––G –––> L–––M–––N–––F2
\ /
topic C–––D
要深入了解这一点,请使用--no-ff
rebase选项阅读字母How to Revert a Faulty Merge的最后一部分,以重新创建分支。
答案 1 :(得分:3)
@Highway of Life有一个很好的答案。一件事是,现在看起来像是新的不同提交,在许多情况下可能是不合需要的。我想第二次合并相同的提交,但git-merge
阻止了这一点。但是,我一次又一次地发现,总是可以让git做你想做的事。
按照生命之路的指示,但不要直接合并到主人身上:
git checkout -b fixed-topic <D>
git rebase -i --no-ff <B>
git checkout -b re-merged master
git merge fixed-topic
这导致:
re-merged ––––––––––––––––––––------R
/ /
fixed–topic C'–––D' /
/ /
master A–––B–––E–––F–––G –––> L–––M–––N–––F2
\ /
topic C–––D
现在树的设置完全符合您的要求 - 所有文件都准确显示您想要的内容。一个问题是你的合并提交的父母是你原始提交的重新定位副本,而不是实际上是原始提交本身。使用git-reparent
:
git reparent -p master -p <D>
这最终得到:
master A–––B–––E–––F–––G –––> L–––M–––N–––F2
\ / \
topic C–––D \
\ \
re-merged ---------------------------R
需要注意的一点是,自上一步以来,R避免的内容发生了变化 - 只有父母。
快速转发master到新的合并提交:
git checkout master
git merge re-merged
最后,您可以使用
进行清理git branch -d fixed-topic re-master
完成!现在你的历史看起来像这样,一个分支合并了两次:
master A–––B–––E–––F–––G –––> L–––M–––N–––F2---R
\ / /
topic C–––D----------------------------
答案 2 :(得分:0)
一种合并策略,即“保留你所拥有的东西,无论你合并的是什么”,它的性质都无法逆转。在新分支中签出合并的第一个父级,然后再次进行合并。 Rebase - 在您原始合并之上的其余提交到这个提交。
更新:
在你的情况下,如果你不关心过去,你可以将G-N重新加入E,然后将D合并到这个新的主人身上。因为F是-ours merge,所以rebase将是微不足道的。