2013-05-10 72 views
7

git diff other_branch顯示差異時git merge other_branch什麼都不做,我被困住了。將「缺少的」代碼合併到my_branch中的正確方法是什麼?當`git diff`顯示更改但git merge`什麼都不做時,合併分支的正確方法

SO answer圖表類似於我的情況。

o---A---B---C-------G my_branch 
    \  \ /
     --*D*---E---F other_branch 

令人驚訝的改變d不會自動合併到my_branch當我做

git checkout my_branch 
git merge other_branch 

帶來˚F

我當然manually create a patch和將其應用於my_branch,如下所示:

git diff other_branch my_branch > patchfile 
git checkout my_branch 
git patch -p1 < patchfile 

但我想這樣做,沒有弄糟git日誌。使用補丁的方法,git會記錄在D和我的最新補丁中發生的變化,它們彼此獨立(代碼流失)。我想簡化git log,並確保其他人在他們執行git merge my_branch時不會有意外的事情發生(悄悄地和陰險地)。

+2

您是否嘗試將'my_branch'合併到'other_branch'中?可能這可以解決分歧。如果某些提交已在'my_branch'中恢復,但未在'other_branch'中恢復,則最終會出現這種情況。 – iltempo 2013-05-10 20:51:55

+0

@iltempo,我在你的評論後嘗試合併,是的,它確實解決了差異和git diff現在是乾淨的。我只需要相信它合適的合併。 – hobs 2013-05-10 21:44:12

+0

@iltempo,我沒有故意恢復'my_branch'中的任何更改,但很可能會有 - 在簽出和編輯和簽出之間進行擺動之後,通過點擊保存在崇高(文本編輯器)中進行提交。我需要更加小心所有這些。 – hobs 2013-05-10 22:16:59

回答

2

您在這裏似乎同時有兩個問題。

假設像你描述的歷史:

   my_branch 
        v 
----A---B---C-------G 
    \  \ /
     --*D*---E---F 
       ^
      other_branch 

爲什麼DIFF不爲空:

這種情況是由你所提到的命令產生的,即爲上my_branch,然後做git merge other_branch。此操作產生了一個合併提交G,並將當前分支(my_branch)向前移動,但保留other_branch。這就是合併總是如何工作的!自然,在這一點上,my_branchG)和other_branchF)之間仍然存在差異 - 畢竟它們指向不同的提交。

如果你想兩個分支是相同的,您可以通過以下方式拉昇other_branch

  1. git checkout other_branch; git merge my_branch - 這是自G一個快進合併是F
  2. 後裔
  3. [雖然不在other_branch!]git branch -D other_branch; git branch other_branch my_branch - 這將刪除other_branch然後在my_branch目前是
  4. git checkout other_branch; git reset --hard my_branch同一位置重新創建它 - 這將舉動other_branch點究竟在何處my_branch當前指向

後做一個這些步驟,my_branchother_branch都將指向G


爲什麼變化犯D不是my_branchG

Git的合併歷史,沒有變化。這通常意味着Git將採取合併的雙方(並且,如果可能的話,他們最年輕的共同祖先提交,也就是merge-base)並嘗試將它們合併。由於Git提交的是快照,而不是changesets/deltas/diffs,因此在實際合併中沒有使用其他提交或更改的信息。

使用合併基礎,Git進行所謂的三向合併,使用共同的祖先嚐試巧妙地解決雙方的變化。如果不能,它會中斷合併並要求用戶解決衝突。

什麼可能發生在你們的歷史是,要麼提交EF恢復(或凌駕於)的D的變化 - 這可能它生產E或實際(手動)變化F在合併過程中發生的。

正如你自己在評論中提到的,你經常在提交和編輯之間切換。因此,你會浮動很多變化(Git在結賬時攜帶未提交的變更),這很可能很難說明變化應該發生在哪裏以及他們實際去哪裏。嘗試通過在更改分支之前提交任何更改或使用git stash緩存它們來避免此問題。

相關問題