2016-05-06 168 views
0

我遇到了一個有趣的合併問題。我不完全知道如何解釋它,所以我希望這個圖會得到更清晰的思路:切換主分支後git合併到主分支中

enter image description here

基本上,在紫色中所使用的分支是主分支,但後來我需要恢復到之前的提交以進行不同的更改。當我想這樣做時,我使用指令here切換了主分支,但是從圖中可以看到,這會導致原始主控與新主控(「藍綠色」)的「空白」合併。

現在,我實際上想要將紫色提交合並回主,兩者都從相同的原始提交中彈出。在嘗試合併回主模塊之前,我對紫色提交做了一些更改(如第二次最近的提交所示)。但是,當我嘗試合併時,沒有給出該選項,因爲git認爲合併已經發生(如圖中底部的「空」合併)。

我怎樣才能真正地合併這兩個分支的內容?

+0

你想重寫你的歷史嗎? –

+0

那種?如果刪除空提交可以讓我正確合併,我想這將是一個解決方案。 – Charles

+0

你是否意識到圖(和bash)表示紫色分支已經被合併到teal分支中? –

回答

0

我們分別處理兩個提交。首先是最近的一個。

你有這個。 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

注意,結果是masterZ1,不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現在是主人的一部分,只是補丁主人。

相關問題