42 votes

GitHub de Fusion de la branche "master"

Essayé de Git et Github après de nombreuses années de svn utilisation. Il me semble avoir assimilé les principes de base, mais un article est de me confondre.

  • L'utilisateur effectue un changement d'FileA et pousse vers le serveur distant (GitHub)

  • UserB en fait un changement de Fichierb. Il a d'abord tire à distance serveur, puis pousse son changement de Fichierb vers le serveur distant

  • GitHub commettre l'histoire montre la poussée de l'Utilisateur et de la poussée de l'utilisateur b

  • Cependant, il y a une entrée supplémentaire dans le commit l'histoire de UserB appelé "la Fusion de la branche "master" de https://github.com/xxx/yyy'. L'affichage de la diff sur Github montre pour être une réplique exacte des Modifications que l'Utilisateur fait de FileA

Pourquoi est ce double démontré à la fois la poussée de UserA de FileA, et la Fusion de la branche master entrées sont identiques...le second semble superflu pour moi.

68voto

Mark Longair Points 93104

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X