如何恢复使用策略=我们的合并?

时间:2013-01-08 23:26:54

标签: git git-merge git-revert

我正在使用几周前进行合并的存储库,我们刚刚发现它使用--strategy=ours标志(它应该使用--strategy-option =我们的标志),因此不应用任何改为HEAD。但是,我们需要应用更改。 Git已经将分支识别为已合并以及分支历史记录中的提交。

无法使用git revert -m ...

还原此类合并

恢复和/或重新应用合并以更改文件的正确方法是什么?

master  A - B - E - F - G ---> L - M - N
             \     /
topic         C - D

合并提交(F)将是此方案的罪魁祸首。

3 个答案:

答案 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做你想做的事。

  1. 按照生命之路的指示,但不要直接合并到主人身上:

    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
    
  2. 现在树的设置完全符合您的要求 - 所有文件都准确显示您想要的内容。一个问题是你的合并提交的父母是你原始提交的重新定位副本,而不是实际上是原始提交本身。使用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避免的内容发生了变化 - 只有父母。

  3. 快速转发master到新的合并提交:

    git checkout master
    git merge re-merged
    
  4. 最后,您可以使用

    进行清理
    git branch -d fixed-topic re-master
    
  5. 完成!现在你的历史看起来像这样,一个分支合并了两次:

    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将是微不足道的。