2011-06-17 9 views
6

マージプロセスで作成されたコミットに関してgitマージがどのように機能するかを理解できません。私はpro gitとgit communityの書籍の関連するセクションを読んだが、まだ混乱している。gitはマージでどのようにコミットを処理しますか?

は、このシナリオを考えてみましょう:私は「起源」Gitのレポを持っている:

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

私は地元のレポにこのレポのクローンを作成し、ローカルレポでのみ動作します。ブランチ2では、私は "git merge master"をやった。これでローカルリポジトリは次のようになります。

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

したがって、 "b1"コミット後に1つのコミット "merge"が作成されました。私は1つは、現在のヘッドの前にコミット行けばコミット予想通り、私は、B1を取得、また

> 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 

:BRANCH2のための「gitのログは、」期待されるグラフを示しています。 (グラフのブランチ2ラインに従って1コミットに戻る)

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

ここで私は混乱しています。私はまだ私の変更を原点にプッシュしていませんが、 "git status"を実行すると、ローカルブランチ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に起源/ BRANCH2から「gitのログ」を行うと、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〜代わりB1のA3' に私をもたらすだろう。

ご協力いただきありがとうございます。

+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 

手段:origin/branch2(陰性参照)上にないbranch2上のすべてのコミット(陽性参照)
(正と負の参照に、参照origin/branch2にない「Difference in 'git log origin/master' vs 'git log origin/master..'」)あなたの場合

、マージした後、あなたはbranch2(ローカル1で4つのコミットをしていません):a1a2,a3およびmergeである。

+0

あなたの迅速な対応に感謝します。だから私は2つのことを誤解していました: 1) "あなたの支店はxコミットでより先です。"現在のブランチに、に存在しないx個のコミットがあることを意味します。これらのxコミットは、現在のブランチととの間に4つのコミットがレポ・グラフ上にあることを意味しません。 2)git log .. 私はからまでを横断してレポ・グラフに表示しているので、何をコミットするかはわかりません。代わりに、の履歴にコミットの「差分」を表示することが考えられます。 – digitalsky

+0

@digitalsky: 'git log'はリビジョンの*範囲*をとり、リビジョンのグラフを歩いて、正のリファレンスから始めて、リビジョン履歴に戻り、負のリファレンスから到達可能なリビジョンに遭遇したときに停止します。 。 'git diff'は* 2つのリビジョン(範囲ではない)をとり、これらの2つの間にdiffを表示します。 'diff A ... B'を除いて、' A'から分岐したので 'B'で表示されます。 – VonC

+0

@digitalsky:あなたの1)は、リビジョングラフの後ろを歩いて、別のブランチからコミットしたことを知っているので、あなたのローカルブランチからマージするようになりました。あなたの2)については、私は "diff"という用語を避けるだろう;) – VonC

関連する問題