繁体   English   中英

错误合并后重建git分支(尊重合并提交)

[英]Rebuilding git branch after a faulty merge (respecting merge commits)

我有一个典型的情况:我将一个dev分支合并到master ,然后意识到我犯了一个错误并恢复了合并。 然后将一个修复程序添加到dev并希望再次合并它。 当然,我不能直接合并它,因为从git的角度来看,它已经被合并了。

经典解决方案

还原还原提交,应用您的修复程序。 继续。

  • 优点 :简单。

  • 缺点 :历史被宠坏了。 很难比这次恢复的责任更深。

我想要的是

我想从头开始重建dev分支,然后再次合并。 根据书,应该使用git rebase --force-rebase轻松完成。 但是分支的历史记录并不是那么简单,它包含许多合并,包括master合并。 我要尊重这些。

让我们已经有一个例子:

                                     master|
                                           v
-*------------X-----Y---------*-----*----M-W
  \          /       \         \   /    /
   \        /         \         -*-    /
    \      /  -D-      G--H--         /
     \    /  /   \    /      \       /
      A--B--C-----E--F--------I-----J
                                    ^
                                    |dev

错误的合并是M 其还原为W 我认为对B dev提交是可以的,因为B已作为X合并到master中。 我想从B开始以完全相同的拓扑重建分支。 请参阅下面的树。 新提交标记有撇号。 您可以看到如何将提交C..J重新设置为C'..J' 相应地, dev会以dev' 其他提交未更改。

                                dev'|
                                    v
            C'----E'-F'-------I'----J'
           / \   /    \      /        
          |   -D'      G'-H'-           
          |           /                    |master
          |          /                     v
-*--------+---X-----Y---------*-----*----M-W
  \       |  /       \         \   /    /
   \      | /         \         -*-    /
    \     |/  -D-      G--H--         /
     \    /  /   \    /      \       /
      A--B--C-----E--F--------I-----J
                                    ^
                                    |dev


然后,我将应用我的修订K并将此新分支合并到master

                                dev'|
                                    v
            C'----E'-F'-------I'----J'--K
           / \   /    \      /           \
          |   -D'      G'-H'-             \
          |           /                    \ |master
          |          /                      \v
-*--------+---X-----Y---------*-----*----M-W-M2
  \       |  /       \         \   /    /
   \      | /         \         -*-    /
    \     |/  -D-      G--H--         /
     \    /  /   \    /      \       /
      A--B--C-----E--F--------I-----J
                                    ^
                                    |dev

  • 优点 :良好的历史。

  • 缺点 :我不知道该怎么做。

好的,似乎rebase为此提供了一个选项,它称为--rebase-merges 但这并不能满足我的要求。 它以所有提交为基础, dev祖先和B后代 其中包括提交XY 哪些已经master了,我为什么要它们? (实际上,它还带来了更古老的历史中的其他一些贡献,我还不知道为什么,但这不是重点)。

相反,我想提出一些提交, 这些提交dev始祖,而不是master (当然,在错误合并之前考虑master )。 对我来说听起来真的很容易。 但是我不知道该怎么做,除非通过手工构造这种不同的提交,然后以某种方式手工挑选它们,并小心翼翼地保护父母。

那么,如何重建分支, 包含在分支上完成的工作并尊重合并提交?

PS我们不能简单地将master重置为M^ ,这太容易了。

好的,好像我找到了解决方案:

  1. git rebase --interactive --rebase-merges B dev
  2. 改写C

这正是我想要的历史。 归功于@mstrap作为提示。

我不确定这为什么能按我想要的方式工作。

基于https://github.com/git/git/blob/master/Documentation/howto/revert-a-faulty-merge.txt ,我会

git checkout dev
$EDITOR files
git commit files -m 'Fix'
git checkout master
git revert W
git merge dev

当您重新合并时,还原-还原是保持更改所必需的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM