[英]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.