Dans git, en quoi fetch est-il différent de pull et en quoi la fusion est-elle différente de rebase?

160

Je ne peux juste pas comprendre ça. J'ai beaucoup lu sur le Web et des livres et quelque chose ne me reste pas dans la tête. Quelqu'un peut-il me donner la version factice de ce qui suit:

  • git fetch vs pull
  • git merge vs rebase
techsjs2013
la source
24
Je sympathise avec le questionneur. La documentation et les conseils sont si lourds et les permutations de flux de travail possibles si massives que l'on devient extrêmement confus. La tête vient d'exploser et on ne sait pas trop quoi demander, ce n'est tout simplement pas si évident.
Ed Randall
3
Pourquoi ne pas choisir la réponse pestrella comme acceptée?
Arashsoft
@Arashsoft car il n'est pas vu depuis 2013
VdeX

Réponses:

415

chercher vs tirer

fetch téléchargera toutes les modifications depuis la branche distante *, mettant à jour les données de votre référentiel, mais laissant votre branche locale * inchangée.

pulleffectuera une fetchet en plus mergeles modifications dans votre succursale locale.

Quelle est la différence? pullmet à jour votre branche locale avec les modifications de la branche extraite. A fetchne fait pas avancer votre succursale locale.

fusion vs rebase

Compte tenu de l'histoire suivante:

          C --- D --- E local
         /
    A --- B --- F --- G à distance

mergejoint deux histoires de développement ensemble. Pour ce faire, il rejoue les modifications qui se sont produites sur votre branche locale après sa divergence au-dessus de la branche distante et enregistre le résultat dans une nouvelle validation. Cette opération préserve l'ascendance de chaque commit.

L'effet d'un mergetestament sera:

          C --- D --- E local
         / \
    A --- B --- F --- G --- H à distance

rebaseprendra les commits qui existent dans votre branche locale et les réappliquera sur la branche distante. Cette opération réécrit les ancêtres de vos commits locaux.

L'effet d'un rebasetestament sera:

                  C '- D' - E 'local
                 /
    A --- B --- F --- G à distance

Quelle est la différence? A mergene change pas l'ascendance des commits. A rebase réécrit l'ascendance de vos commits locaux.

*Cette explication suppose que la branche de courant est une branche locale, et en ce que la branche spécifiée comme argument de fetch, pull, merge, ou rebaseest une branche à distance. C'est le cas habituel. pull, par exemple, téléchargera toutes les modifications de la branche spécifiée , mettra à jour votre référentiel et mergeles modifications dans la branche actuelle .

pestrella
la source
31
C'est de loin l'explication la plus simple et la meilleure sans entrer dans le débat derrière chaque pratique. Je vous remercie!
Jonathan S. Fisher
3
Réponse absolument en or
ChaseMoskal
5
J'aimerais pouvoir "favori" cette réponse. Peut-être que je vais simplement l'imprimer et le coller sur mon mur.
LarsH
2
Je dirais la meilleure des meilleures réponses que j'ai dans stackoverflow, merci
Shahab J
1
Si fetch télécharge uniquement les modifications de la branche distante et met à jour les données du référentiel, mais laisse la branche locale inchangée, alors à quoi sert la récupération si le répertoire de travail n'affiche / ne reflète pas les modifications? Ma question à l'origine était la suivante: comment pourrais-je voir les changements que quelqu'un d'autre a fait et ensuite décider si je voudrais les fusionner dans mon répertoire de travail (c'est-à-dire expérimenter avec les changements d'autres personnes pour m'assurer que cela n'interrompt pas mon travail) mais je suis toujours confus comment faire cela? Dois-je simplement essayer et expérimenter / explorer, et si cela posait problème, faire une réinitialisation matérielle?
28

Extraire vs Pull

Git fetch met simplement à jour vos données de dépôt, mais un git pull effectuera essentiellement une extraction, puis fusionnera la branche extraite

Quelle est la différence entre 'git pull' et 'git fetch'?


Fusion vs Rebase

à partir du blog Atlassian SourceTree, Fusion ou Rebase :

La fusion réunit deux axes de développement tout en préservant l'ascendance de chaque histoire de commit.

En revanche, le rebasage unifie les lignes de développement en réécrivant les modifications à partir de la branche source afin qu'elles apparaissent comme des enfants de la branche de destination - prétendant en fait que ces commits ont été écrits au-dessus de la branche de destination tout au long.

Découvrez également Learn Git Branching , un jeu sympa qui vient d'être publié sur HackerNews ( lien vers l'article ) et qui enseigne de nombreuses astuces de branchement et de fusion. Je pense que ce sera très utile à cet égard.

Felipe Sabino
la source
merci Felips .. donc si je fais une récupération depuis une télécommande ma branche principale n'aura pas les mises à jour? aussi il semble que je devrais faire rebase plus que merga
techsjs2013
rebase vs merge dépend de votre intention, en gardant à l'esprit que rebase réécrit tout l'historique des commits. Et oui, si vous récupérez uniquement, la branche principale ne sera pas modifiée, vous devrez fusionner (ou tirer) pour qu'elle applique les modifications à distance
Felipe Sabino
git merge <remote>/<branch>. par exemple, si vous êtes la branche principale et que votre télécommande est nommée origin, vous pouvez le faire git merge origin/master.
Felipe Sabino
donc il semble que je devrais toujours faire un git checkout master git fetch git diff origin / master git rebase origin master
techsjs2013
8

tirer vs récupérer :

La façon dont je comprends cela, c'est que git pullc'est simplement un git fetchsuivi de git merge. C'est-à-dire que vous récupérez les modifications à partir d'une branche distante, puis vous les fusionnez dans la branche actuelle.


fusion vs rebase :

Une fusion fera ce que la commande dit; fusionner les différences entre la branche actuelle et la branche spécifiée (dans la branche actuelle). C'est-à-dire que la commande git merge another_branchfusionnera another_branchdans la branche actuelle.

Un rebase fonctionne un peu différemment et est plutôt cool. Disons que vous exécutez la commande git rebase another_branch. Git trouvera d'abord la dernière version commune entre la branche actuelle et another_branch. C'est-à-dire le point avant que les branches aient divergé. Ensuite, git déplacera ce point divergent vers la tête du fichier another_branch. Enfin, tous les commits de la branche courante depuis le point divergent d'origine sont rejoués à partir du nouveau point divergent. Cela crée une histoire très propre, avec moins de branches et de fusions.

Cependant, ce n'est pas sans pièges! Puisque l'historique des versions est "réécrit", vous ne devez le faire que si les commits existent uniquement dans votre dépôt git local. Autrement dit: ne faites jamais cela si vous avez poussé les commits vers un dépôt distant.

L'explication sur le rebasage donnée dans ce livre en ligne est assez bonne, avec des illustrations faciles à comprendre.


tirer avec rebasage au lieu de fusionner

J'utilise en fait beaucoup rebase, mais c'est généralement en combinaison avec pull:

git pull --rebase

récupérera les modifications distantes, puis rebasera au lieu de fusionner. C'est-à-dire qu'il rejouera tous vos commits locaux depuis la dernière fois que vous avez effectué un pull. Je trouve cela beaucoup plus propre que de faire un pull normal avec la fusion, ce qui créera un commit supplémentaire avec les fusions.

Steinar
la source
donc si je travaille dans and branch et que je veux le fusionner dans le master avant de faire un push. Je devrais commander le maître, puis obtenir un correctif de rebase?
techsjs2013
Je ne comprends toujours pas la fusion vs le rebase
techsjs2013
Je pense que les illustrations fournies par la réponse de pestrella montrent clairement la différence. Consultez également: git-scm.com/book/en/Git-Branching-Rebasing - qui fait un travail assez décent pour l'expliquer (même lien que celui de la réponse, mais redonné pour les paresseux).
Steinar
0

Merge - La branche HEAD générera un nouveau commit, préservant l'ascendance de chaque historique de commit. L'histoire peut devenir polluée si les validations de fusion sont effectuées par plusieurs personnes travaillant sur la même branche en parallèle.

Rebase - Réécrit les modifications d'une branche sur une autre sans créer un nouveau commit. L'historique du code est simplifié, linéaire et lisible, mais il ne fonctionne pas avec les demandes d'extraction, car vous ne pouvez pas voir les modifications mineures apportées par quelqu'un.

J'utiliserais git mergepour traiter le flux de travail basé sur les fonctionnalités ou si je ne suis pas familier avec le rebase. Mais, si je veux une histoire plus propre et linéaire, alors git rebasec'est plus approprié. Pour plus de détails, consultez cet article sur la fusion ou le rebase .

Nesha Zoric
la source