[英]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
后代 。 其中包括提交X
和Y
哪些已经master
了,我为什么要它们? (实际上,它还带来了更古老的历史中的其他一些贡献,我还不知道为什么,但这不是重点)。
相反,我想提出一些提交, 这些提交是dev
始祖,而不是master
(当然,在错误合并之前考虑master
)。 对我来说听起来真的很容易。 但是我不知道该怎么做,除非通过手工构造这种不同的提交,然后以某种方式手工挑选它们,并小心翼翼地保护父母。
那么,如何重建分支, 只包含在分支上完成的工作并尊重合并提交?
PS我们不能简单地将master
重置为M^
,这太容易了。
好的,好像我找到了解决方案:
git rebase --interactive --rebase-merges B dev
这正是我想要的历史。 归功于@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.