我們分別處理兩個提交。首先是最近的一個。
你有這個。 M是合併,Z是最新的紫色提交。
... A - B - M [master]
/
... Z
你想這樣的:
... A - B - Z1 [master]
結賬B,在它上面的櫻桃挑Z(。即把該補丁,這將成爲新的提交Z1),宣佈新的主人。
git checkout B
git cherry-pick Z
git branch -f master
注意,結果是master
在Z1
,不Z
指點。相同的內容,不同的ID。 Git不會重寫歷史,因爲它會創造新的歷史。您的存儲庫實際上是這樣的:
... A - B - Z1 [master]
\
... Z - M
沒有指向M(記住,git中的連接向後),它將被垃圾收集。那麼Z將沒有指向它,它將被垃圾收集。
第二個紫色提交更棘手。這是很早以前的事情,你可能不想在沒有充分理由的情況下搞砸它。沒有看到它的祖先,很難知道可以用它做什麼。所有你已經證明我們是這樣的:
... M2 - D - E ... A - B - Z1 [master]
/
... Y
不知道之前的M2和Y我們無法知道它是安全的改寫歷史,或者如果合併應單獨留下什麼。它可能看起來像這樣:
... F - G - H - M2 - D - E ... A - B - Z1 [master]
/
... W - X - Y
在這種情況下,它是一個合法的合併,應該單獨留下。或者,它可能是這樣的:
... H - M2 - D - E ... A - B - Z1 [master]
\/
Y
在這種情況下,您可以通過Y.
git checkout master
git rebase Y
上衍合主消除合併這一切都取決於Y和Z在做什麼。他們有關係嗎?是Z並嘗試修復Y中的某些內容?如果是這樣,考慮Y自己的分支爲時已晚。一旦分支合併,就不要把它當作分支來對待。 Y現在是主人的一部分,只是補丁主人。
你想重寫你的歷史嗎? –
那種?如果刪除空提交可以讓我正確合併,我想這將是一個解決方案。 – Charles
你是否意識到圖(和bash)表示紫色分支已經被合併到teal分支中? –