2011-06-17 5 views
6

Je n'arrive pas à comprendre comment fonctionne une fusion git en termes de validations créées par le processus de fusion. J'ai lu les sections pertinentes dans le pro git et le livre de la communauté git, mais je suis toujours confus.Comment git gère les validations dans une fusion?

Considérons ce scénario: J'ai un git "origine":

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

je clone ce repo à un repo local, puis travaille uniquement sur le repo local. Dans branch2, j'ai fait un "git merge master". Maintenant, mon apparence repo locale comme ceci:

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

Ainsi, la fusion a créé 1 COMMIT "fusion", après la "b1" commit. « Git log » pour succursale2 montre le graphique attendu:

> 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 

De plus, si je vais un commettras avant que la tête actuelle, je peux b1 engager, comme prévu. (suivez la ligne branch2 dans le graphique et retournez 1 commit)

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

Voici ma confusion. Je n'ai pas encore poussé mes changements à l'origine, mais quand je fais un "git status", git dit que ma branche locale2 est en avance sur l'origine/branche2 par 4 commits. Je pensais que la fusion a abouti à 1 nouveau commit "fusion", comme vu par le graphique/diagrammes ci-dessus? Pourquoi 4?

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

Aussi, faire un « journal git » d'origine/succursale2 à succursale2 montre le 4 engage au lieu du 1 je m'y attendais (allant de « b1 » à « fusion »).

> 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 

I comprennent les 4 commits sont les 3 à partir du maître (a1, a2, a3) que la fusion est censé amener à la branche 2, ainsi que la validation "de fusion". Mais pourquoi le graphique ne le montre-t-il pas de cette façon? Si c'est le cas, cela ressemblerait à:

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

Et branch2 ~ me ramènerait à a3 'au lieu de b1.

Merci d'avance pour toute aide.

+0

a1, a2, a3 et merge ne font tout simplement pas partie de l'origine/branche2, c'est pourquoi il vous commet 4 validations. –

+0

Si vous souhaitez que les modifications de la fusion se fassent en une seule validation, vous pouvez utiliser 'git merge --squash'. – hammar

Répondre

6

Comme mentionné dans "How to get the changes on a branch in git":

git log origin/branch2..branch2 

signifie: tous les commits sur branch2 (référence positive) qui ne sont pas sur origin/branch2 (référence négative)
(sur les références positives et négatives, voir "Difference in 'git log origin/master' vs 'git log origin/master..'")

Dans votre cas, après la fusion, vous avez 4 commits sur branch2 (le local) qui ne sont pas sur origin/branch2: a1, a2, a3 et merge.

+0

Merci pour votre réponse rapide. J'ai donc mal compris 2 choses: 1) "Votre branche est en avance sur par x commits." signifie qu'il existe des x validations dans votre branche actuelle qui n'existent pas dans .Ces x validations ne signifient PAS qu'il y a 4 validations entre votre branche actuelle et sur un graphique repo. 2) git log .. ne montre pas ce que commet je passerais comme je transverse de à dans un graphique de repo. Au lieu de cela, on peut penser à montrer un "diff" des commits dans l'histoire de et . – digitalsky

+0

@digitalsky: 'git log' prend une * range * de révision, et marche sur le graphe des révisions, en commençant par la référence positive, en remontant l'historique des révisions, en s'arrêtant quand il rencontre les révisions qui sont accessibles depuis la référence négative . 'git diff' prend * deux * révisions (pas une plage de) et consiste à montrer le diff entre ces deux. Sauf pour 'diff A ... B' qui apparaît dans' B' puisqu'il a divergé de 'A'. – VonC

+0

@digitalsky: donc quatre votre 1), la partie «en avant» consiste à revenir sur le graphe de révision, sachant que les commits d'une autre branche, une fois fusionnés avec votre branche locale, sont maintenant accessibles depuis cette branche locale. Pour votre 2), j'éviterais le terme "diff";) – VonC

Questions connexes