簡體   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