2017-06-13 99 views
1

我一直在淘金的stackoverflow和其他論壇找到答案無濟於事 - 似乎沒有什麼適合我正在尋找什麼。看到主人和現場分支之間的提交git日誌

所以,問題如下: 我有一個主分支現場分支。發展仍在主分支,並且當提交被認爲是適當的時,它們被挑選到直播分支

然而,我發現,活分支有一個錯誤,這是固定在主分支,我試圖尋找引進修復主分支其呈交。

我想通過首先看到master和live之間的提交差異來做到這一點。主人的一些承諾沒有實現,哪些?

我試過如下:

git log --cherry-pick --oneline --no-merges --right-only live-branch..master 

,但我真的不明白這個命令,這告訴我犯的區別,但是這給了我這是在現場和掌握相同的提交,只是哈希是不同的。

我需要一種類似補丁的方式來做到這一點。 git diff commit_from_master,v3.8如果爲空忽略。

我該怎麼做?

如果需要更多說明,我會更新。

+0

考慮使用'git bisect' –

+0

這將花費太長時間,這是一個耗時數小時編譯的大項目,需要提交diff ... – janjust

+2

'--right-only'需要使用三點符號, '活分支...主'或'主...活分支'。 '--cherry-pick'和'--cherry-mark'也是一樣。但是,如果有特定的提交修復了特定的錯誤,@TimBiegeleisen是正確的,'git bisect'是找到它的方法。 – torek

回答

3

(擴大評論回答)

我想你可能要--cherry,這是--right-only --cherry-mark --no-merges的同義詞(見git loggit rev-list文檔),或--cherry-pick相同的(你嘗試過),而不是--cherry-mark。這些要求使用對稱差或三點符號,即,live-branch...master

當使用帶有三點符號的--left-right時,如果它們位於「左側」,則提交散列註釋爲<;如果位於「右側」,則提交>。這裏請記住,兩個集合的對稱差異意味着元素是任一集合的成員,但不是兩個集合的集合。當應用到的Git分支,我們得到這樣的:

(left side) (right-side) 
    live-branch  master 

      *   * 
      |   | 
      *   X' 
      |   | 
      :   : 
      |   | 
      X   * 
      \  /
       \ /
       \ /
       \/
       * 
       | 
       : 

每個*或大寫字母代表的一些承諾。這兩個分支在某一時刻聚集在一起,因此left...right會查看聯接「上方」的所有提交,並立即排除所有位於其之下的提交。 (連接點也被排除在外,因爲它是在這兩套,但--boundary再包括它。)

這很好,但我們想知道其提交的左側提交,當然同爲右側提交。然後,使用--cherry--cherry-pick--cherry-mark,我們得到Git分析左側和右側每個提交的補丁等價物。如果兩個不同的提交哈希具有相同的計算git patch-id,這意味着一個可能從另一個挑選出來,它們被鏈接在一起。例如,在上圖中,X和X'是「相同的」,因此它們被鏈接。

各種--cherry選項的行爲是以各種方式使用這些標記。您正在查找master中存在的提交,但不存在於live-branch中,因此在標記成對之後,您只需要右側(master)提交,該提交沒有對應的左側提交(live-branch)。使用--cherry-mark,你可以用標記看到它們;與--cherry-pick,Git將完全放棄標記/配對的。