2011-06-17 31 views
6

我無法理解git合併如何根據合併過程創建的提交進行工作。我已閱讀pro git和git社區書中的相關部分,但我仍然感到困惑。git句柄如何在合併中提交?

考慮這個情景,我有一個「原點」混帳回購協議:

  master 
      | 
a0--a1--a2--a3 
    \ 
    -b0--b1 
     | 
     branch2 

我克隆此回購到本地回購,然後只對本地回購工作。在branch2中,我做了一個「git merge master」。現在我的本地回購是這樣的:

 master/origin/master 
      | 
a0--a1--a2--a3 
    \   \ 
    -b0--b1-----merge 
     |  | 
    origin/branch2 |  
       branch2 

因此合併創建1承諾,「合併」,之後的「B1」承諾。 「混帳日誌」爲BRANCH2顯示預期的圖形:

> git log branch2 --graph --pretty=oneline --decorate 
* a7b69fc6759e1dd5463bab379ce101a6ad026c7b (HEAD, branch2) Merge branch 'master' into branch2 
|\ 
| * 482e4026f05e33395a9fc3c87f50a746f692406a (origin/master, origin/HEAD, master) a3 
| * 8de57bdea2d316073af3b7055f8c28c56004ce94 a2 
| * 1e991047996aad269f2c01b9a0b9a7d8293096a1 a1 
* | 99955f66843df51fb9d40c7797156c32cad57415 (origin/branch2) b1 
* | 30ca9b6363558322f2bb7810d75cda0d9c2ba3e0 b0 
|/ 
* 76a7c6d0eb54a9580841115ff2c3429360ab2ac9 a0 

另外,如果我走了當前頭前一個承諾,我到B1承諾,符合市場預期。 (沿着圖中的分支2線返回1提交)

> git log branch2~ --graph --pretty=oneline --decorate 
* 99955f66843df51fb9d40c7797156c32cad57415 (origin/branch2) b1 
* 30ca9b6363558322f2bb7810d75cda0d9c2ba3e0 b0 
* 76a7c6d0eb54a9580841115ff2c3429360ab2ac9 a0 

這裏是我的困惑。我還沒有推動我的更改到原點,但是當我做一個「git status」時,git說我的本地分支2比原始/分支2提前4個提交。我認爲合併只導致了1個新的「合併」提交,如上圖所示?爲什麼4?

> git status 
# On branch branch2 
# Your branch is ahead of 'origin/branch2' by 4 commits. 
# 
nothing to commit (working directory clean) 

此外,從產地/ BRANCH2做一個「git的日誌」到BRANCH2顯示4犯,而不是1我的預期(從正在進行的「B1」到「合併」)。

> git log origin/branch2..branch2 --graph --pretty=oneline --decorate 
* a7b69fc6759e1dd5463bab379ce101a6ad026c7b (HEAD, branch2) Merge branch 'master' into branch2 
* 482e4026f05e33395a9fc3c87f50a746f692406a (origin/master, origin/HEAD, master) a3 
* 8de57bdea2d316073af3b7055f8c28c56004ce94 a2 
* 1e991047996aad269f2c01b9a0b9a7d8293096a1 a1 

我明白了4個提交是3從主(A1,A2,A3)的合併能爲我們帶來了分支2,再加上「合併」承諾。但爲什麼圖表不這樣顯示呢?如果是這樣,它會看起來像:

 master/origin/master 
      | 
a0--a1--a2--a3----------- 
    \      \ 
    -b0--b1--a1'--a2'--a3'--merge 
     |     | 
    origin/branch2   |  
         branch2 

而branch2〜會帶我到a3'而不是b1。

預先感謝任何幫助。

+0

a1,a2,a3和merge並不是origin/branch2的一部分,這就是爲什麼它會讓你感覺到4次提交。 –

+0

如果您希望將合併中的更改作爲單個提交進行,您可以使用'git merge --squash'。 – hammar

回答

6

正如在 「How to get the changes on a branch in git」 中提到:

git log origin/branch2..branch2 

指:上branch2(正基準)的所有提交其不是上origin/branch2(負參考)
(在正和負參考,見「Difference in 'git log origin/master' vs 'git log origin/master..'」)

在你的情況下,合併後,你做對branch2(當地的一個4個提交)使不上origin/branch2a1a2a3merge

+0

感謝您的快速響應。所以我誤解了兩件事: 1)「你的分支在x提交之前是」。表示在當前分支中有x個提交,但不存在於中。這些x提交併不意味着您的當前分支和回購圖上的有4個提交。 2)git log .. 沒有顯示我會經歷什麼提交,因爲我在回購圖中從。相反,可以考慮在的歷史記錄中顯示提交的「差異」。 – digitalsky

+0

@digitalsky:'git log'需要一個*範圍*版本,並且是關於修訂版本的圖形,從正面引用開始,回溯修訂歷史記錄,當它遇到可以從負面引用訪問的修訂時停止。 'git diff'需要*兩個*版本(不是一個範圍),並且顯示了這兩者之間的差異。除了'B'中顯示的'diff A ... B'外,因爲它與'A'不同。 – VonC

+0

@digitalsky:所以你的1)中,「前進」部分是關於回退修訂圖表,知道一旦與本地分支合併後,另一個分支的提交現在可以從所述本地分支到達。對於你的2),我會避免術語「差異」;) – VonC