簡體   English   中英

恢復合並到主,保持功能分支的變化,不改變歷史

[英]revert merge to master, keep feature branch changes, without changing history

我有一個功能分支和一個主分支。 我對該功能做了一些工作,合並到 master 中,推送更改,然后遠程和本地刪除功能分支。 到現在為止還挺好。

合並后,我意識到我的功能更改存在問題。 我想撤消對 master 的合並,但仍保留功能更改,以便我可以再次處理它們。 我不想重寫master的歷史,因為其他人也在努力。 我認為我最好的選擇是使用revert進行新的提交來解決問題?

我原來的:

A---B---C---D   [master]
     \      
      E----F    [feature]

我現在所擁有的:

A---B---C---D---E'---F' [master]

我想要的是:

A---B---C---D---E'---F'---RE'---RF'        [master]
                                 \
                                  E"---F"  [feature]

RE' 還原 E',RF' 還原 F'。 同時E”包含與原始E相同的內容,F”包含與原始F相同的內容。

我該如何實現?

同樣,有很多方法可以做到這一點。 考慮到您想要的最終狀態,這是我最喜歡使用的命令序列 - 它最終只是與您繪制的頭發不同:

  1. git checkout master如果需要,然后git revert HEAD~2..HEAD得到:

     A--B--C--D--E'--F'--RF'--RE' <-- master (HEAD)

    請注意,帶有范圍的git revert以相反的順序提交。

  2. git checkout -b feature

     A--B--C--D--E'--F'--RF'--RE' <-- master, feature (HEAD)
  3. git cherry-pick HEAD~4..HEAD~2 ,再次復制E--F

     A--B--C--D--E'--F'--RF'--RE' <-- master \\ E"--F" <-- feature (HEAD)

如果它有幫助——使用更長的提交鏈,它可能——你可以為各種提交添加臨時標簽。 例如,如果您從以下內容開始:

A--B--C--D--E'--F'   <-- master

並運行:

git tag T1 HEAD~2; git tag T2 HEAD

你得到:

        T1     T2
         |      |
         v      v
A--B--C--D--E'--F'   <-- master

所以現在你可以在任何地方使用T1..T2來表示“提交E'F' ,這樣 revert 命令變成:

git revert T1..T2

櫻桃選擇變成:

git cherry-pick T1..T2

完成后,您可以刪除兩個臨時標簽:

git tag -d T1 T2

因為他們只是在那里記住兩個特定提交的哈希 ID,這些提交划定了“有趣”提交的范圍。 相對名稱( HEAD~2..HEADmaster~2..master )隨着您添加更多提交並導致名稱移動而更改其編號。

我會:

  1. 將還原提交添加到master
git checkout master
git revert HEAD~2..HEAD
git push
  1. 重新創建feature分支
git checkout -b feature
  1. 櫻桃挑選feature提交
git cherry-pick HEAD~4..HEAD~2
git push

你可以做

# make sure you're working from master
git checkout master

# revert commits E and F
# (but in reverse chronological order is better to avoid unnecessary conflicts)
git revert F E

此時你的樹看起來像

A---B---C---D---E---F---F'---E'        [master]

# then create your new branch
git checkout -b feature

# and here you might as well revert the reverts
git revert E' F'

最終獲得

A---B---C---D---E---F---F'---E'        [master]
                              \
                               E''---F''   [feature]

但是我建議在第一次還原期間使用-nEF進行分組(然后您必須在之后提交),在下一階段還原還原會更容易,並且歷史記錄將更具可讀性。 像這樣 :

git checkout master
git revert -n F E
# (at this point, if you had to resolve conflicts, don't forget to add them)
git commit
git checkout -b feature
git revert E'

最后一棵樹:

A---B---C---D---E---F---E'        [master]
                         \
                          E''     [feature]

(其中最后一個模式E'EF的還原)

僅當您對整個情況感到滿意時才推動所有這些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM