33 votes

Git - est-ce que ça tire ou rebase quand on travaille sur des branches avec d'autres personnes

Donc, si j'utilise des branches qui sont des branches distantes (suivies) et que je souhaite obtenir la dernière en date, je ne sais toujours pas si je devrais faire git pull ou git rebase . Je pensais avoir lu que faire git rebase lorsque vous travaillez sur une branche avec d'autres utilisateurs, cela peut les foirer lorsqu'ils tirent ou rebasent. Est-ce vrai? Devrions-nous tous utiliser git pull ?

51voto

webmat Points 13359

Git pull est une combinaison de 2 commandes

  • git fetch (synchronise vos locaux repo avec le nouveau stuff sur la télécommande)
  • git merge (fusion des modifications de la lointaine branche, le cas échéant, dans votre local de suivi de la branche)

git rebase est qu'un ordre de grandeur équivalent à git merge. Il n'est pas d'aller chercher quelque chose à distance. En fait, il n'est pas de faire une fusion correcte soit, il rejoue les commits de la branche que vous êtes debout après la nouvelle s'engage à partir d'une deuxième branche.

Son but est principalement pour vous permettre d'avoir un nettoyeur de l'histoire. Il ne prend pas beaucoup de fusions par de nombreuses personnes, avant que le passé historique dans gitk devient terriblement comme des spaghettis.

Le meilleur graphique explication peut être vu dans les 2 premiers graphiques ici. Mais laissez-moi vous expliquer ici avec un exemple.

J'ai 2 branches: le maître et mybranch. Lorsque debout sur mybranch je peux courir

git rebase master

et je vais obtenir quelque chose de nouveau en maître inséré avant ma plus récente s'engage dans mybranch. C'est parfait, parce que si je maintenant de fusionner ou de rebase les trucs de mybranch en maître, mes nouveaux commits sont ajoutés de façon linéaire à droite après la plus récente s'engage.

Le problème que vous consultez advient-il si je rebase dans le "mauvais" sens. Si je viens de recevoir les plus récentes de maître (avec des modifications) et de master I rebase comme ça (avant de synchroniser ma branche):

git rebase mybranch

Maintenant, ce que je viens de faire, c'est que j'ai inséré ma nouvelle changements, quelque part dans le maître du passé. La ligne principale de commits a changé. Et en raison de la manière dont git fonctionne avec la validation de l'ids, tous les commits (de maître) qui ont été relus au cours de mes nouvelles modifications ont de nouveaux identifiants.

Eh bien, c'est un peu difficile à expliquer en mots... Espérons que cela fait un peu de bon sens :-)

De toute façon, mon propre flux de travail est ceci:

  • 'git pull" nouveaux changements de distance
  • interrupteur à mybranch
  • git rebase maître de' porter la maîtrise de nouveaux changements dans mon commit l'histoire
  • revenez à la maîtrise de
  • 'git merge mybranch', qui n'avance quand tout dans la maîtrise est aussi dans mybranch (évitant ainsi la validation de réorganisation de problème sur un public direction)
  • git push"

Un dernier mot. Je recommande fortement d'utiliser git rebase, lorsque les différences sont insignifiantes (par exemple, les personnes travaillant sur des fichiers différents, ou au moins des lignes différentes). Il a gotcha j'ai essayé d'expliquer simplement là-haut, mais il est beaucoup plus propre histoire.

Dès qu'il peut y avoir des conflits (par exemple, un collègue de travail m'a renommé quelque chose dans un tas de fichiers), je vous recommande fortement de fusion. Dans ce cas, vous serez invité à résoudre le conflit, puis valider la résolution. Sur le côté positif, une opération de fusion est beaucoup plus facile à résoudre quand il y a des conflits. L'inconvénient est que votre histoire peut devenir difficile à suivre si beaucoup de gens ne se confond tout le temps :-)

Bonne chance!

10voto

Pat Notz Points 46841

Git rebase est une ré-écriture de l'histoire. Vous ne devriez jamais faire cela sur les branches qui sont "public" (c'est à dire, les branches que vous partagez avec les autres). Si quelqu'un des clones de votre branche et puis vous rebase cette branche, alors qu'ils ne peuvent plus tirer/fusionner les changements de votre branche-ils vont se lancer à leur ancien de suite et re-tirer.

Cet article sur l'emballage du logiciel avec git est un très bon lire. C'est plus sur la gestion des distributions de logiciel, mais il est assez technique et parle de la façon dont les branches peuvent être utilisées//gérés partagé. Ils en parlent quand rebase et lorsque à tirer et quelles sont les différentes conséquences de chaque sont.

En bref, ils ont tous deux leur place, mais il faut vraiment analyser la différence.

6voto

Greg Hewgill Points 356191

git pull t une fusion si vous avez des commits qui ne sont pas dans la branche distante. git rebase réécrit tout existant, vous vous engagez à être par rapport à l'extrémité de la branche distante. Ils sont semblables en ce qu'ils peuvent provoquer des conflits, mais je pense que l'utilisation d' git rebase si vous le pouvez permet pour faciliter la collaboration. Au cours de la rebase opération, vous pouvez affiner votre commet donc ils regardent comme ils ont été récemment appliquée à la dernière révision de la branche distante. Une fusion est peut-être plus approprié pour les cycles de développement plus long sur une branche qui ont plus d'histoire.

Comme la plupart des autres choses dans git, il y a beaucoup de chevauchement de fonctionnalité afin de s'adapter à différents styles de travail.

2voto

webmat Points 13359

Découvrez les excellentes diffusions Gitcasts sur les branches , les fusions et les rebasages .

0voto

Lee Points 1771

Si vous voulez extraire la source sans affecter les branches distantes et sans modifier la copie locale, utilisez de préférence git pull.

Je pense que si vous avez apporté des modifications à une branche en activité, utilisez git rebase pour changer la base de cette branche en dernier maître distant. Vous conserverez toutes les modifications de votre branche. lieu, plutôt que d'où il était précédemment ramifié.

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