我的建議(或者,「如果我是橙先生,我會怎麼做」)是從git fetch
開始的。現在,我將在我的回購庫中有這個,這是布隆德先生在重組之後以及在「git push -f」之前執行的。
M1 - M2 - M3
\ \
\ \
A1 - A2 A1' - A2'
的一個重要區別是,我有我的本地標籤A
指向修訂版A2,和遠程標籤remotes/origin/A
指向A2' (金髮先生有它周圍指向其他的方式,局部標籤A
指向A2的A2'和remotes/origin/A
)。
如果我一直對我的命名分支副本「A」我要這個:
M1 ---- M2 ---- M3
\ \
\ \
A1 - A2 - A3 A1' - A2'
(與本地標籤指向A3,而不是A2;或A4或A5等等,取決於我已經應用了多少變化。)現在我所要做的就是將我的A3(和A4,如果需要的話)重新貼到A2'上。一個明顯的直接的方式:
$ git branch -a
master
* A
remotes/origin/master
remotes/origin/A
$ git branch new_A remotes/origin/A
$ git rebase -i new_A
,然後刪除轉速A1和A2完全,因爲修改後的有在new_A爲A1' 和A2' 。或者:
$ git checkout -b new_A remotes/origin/A
$ git format-patch -k --stdout A3..A | git am -3 -k
(該git am -3 -k
方法在git-format-patch
手冊頁中描述)。
這些都需要搞清楚什麼我有一個金髮先生沒有他做了他rebase
,即確定A1,A2,A3等
如果第二個方法是成功的我結束了之前:
M1 ---- M2 ---- M3
\ \
\ \
A1 - A2 - A3 A1' - A2' - A3'
在我的分支名new_A
點A3' (我現有A
分支仍然指向舊A3)。如果我使用第一種方法並且成功了,那麼我最終會得到同樣的結果,就是我現有的分支名稱A
現在將指向A3'(並且我沒有爲具有A1-A2-A3的舊分支命名,甚至儘管它仍然在我的回購庫中;找到它需要通過reflogs或類似的)。
(如果我的A3需要修改成爲A3' ,無論是互動底墊和‘混帳上午’方法將需要通過我的工作,當然。)
當然它也可能只是git merge
(如由加里Fixler答案),但是這將創建一個合併提交(「M」,沒有數,下同),並保持轉速A1和A2可見,贈送:
M1 ---- M2 ---- M3
\ \
\ \
A1 - A2 - A3 A1' - A2' -- M
\_______________/
如果你想保留原來的A1和A2,這是一件好事;如果你想擺脫它們,這是一件壞事。所以「做什麼」取決於「你想要結果是什麼」。
編輯補充:我更喜歡format-patch方法,因爲它讓我的老A分支名稱保留下來,同時確保一切都很好。假設所有的工作和是好,這裏是最後幾個步驟:
$ git branch -m A old_A
$ git branch -m new_A A
,然後,如果old_A可以完全放棄:
$ git branch -D old_A
,或者等價地,開始與分支刪除,然後重命名new_A至A.
(編輯:又見git rebase --onto
的文檔,爲基礎重建A3等,到new_A分支的目標。)
注意: '--'和'hard'之間沒有空格 - 我花了一段時間,因爲答案恰好在我的屏幕上被包裹在這兩個之間:) – qbolec