Chaque version ("commit") avec git fait partie d'un graphe, et il est souvent utile de réfléchir à ce que vous faites dans git en termes de ce graphe.
Lorsque l'Utilisateur commence, disons qu'il n'y avait eu que deux commits créé, que nous appellerons P
et Q
:
P--Q (master)
Il modifie alors FileA, étapes de changement et crée un commit qui représente le nouvel état de la source code - disons que la validation est appelé R
. Cela a un seul parent, ce qui est le commit Q
:
P--Q--R (master)
Après avoir réussi à pousser, la validation graphique pour le dépôt GitHub regarde la même chose.
UserB a commencé avec la même histoire:
P--Q (master)
... mais a créé un commit différent, disons appelés S
, qui a sa version modifiée de Fichierb:
P--Q--S (master)
UserB essaie de pousser pour GitHub, mais la pression est refusée, à moins que vous "forcer" la push, vous n'êtes pas autorisé à mettre à jour une branche distante, à moins que la version que vous voulez pousser comprend l'ensemble de l'histoire dans cette branche distante. Donc, UserB tire à partir de GitHub. Un pull vraiment se compose de deux étapes, de l'extraction et de fusion. L'extraction des mises à jour origin/master
, qui est comme un cache de l'état de la branche distante master
à partir de la télécommande origin
. (Ceci est un exemple de "télé-suivi de la branche".)
P--Q--S (master)
\
R (origin/master)
L'histoire de ce graphique est différente, de sorte que la fusion tente d'unifier ces deux histoires en créant une fusion commettre (disons M
), qui a S
et R
en tant que parents, et j'espère que représente les modifications à partir de deux branches:
P--Q--S--M (master)
\ /
\ /
R (origin/master)
Lorsque GitHub vous montre un diff qui représente les changements introduits par la commettre, c'est simple dans le cas d'une livraison avec un parent - il suffit de faire un diff à partir de cette version. Toutefois, dans le cas d'une validation comme M
, avec plus d'un parent, il est de choisir un parent de montrer les diff contre. Ce qui explique pourquoi les diff montré pour la fusion s'engager M
semble être le même que celui indiqué pour l'un de S
ou R
. S'engage dans git sont définies par l'état exact de l'arbre source, pas les modifications qui ont été l'arbre dans cet état.