132 votes

Git cherry pick vs rebase

J'ai récemment commencé à travailler avec Git.

Aller sur le git livre en ligne (Git livre) j'ai trouvé ce qui suit dans le cadre du "Git Rebase" de la section:

Avec la commande rebase, vous pouvez prendre toutes les modifications qui ont été engagé sur une branche et les relire sur un autre.

(Cité: http://git-scm.com/book/en/Git-Branching-Rebasing)

J'ai pensé que c'est la définition exacte de git cherry-pick (réappliquer un commit ou un ensemble de commits sur l'extrait de la branche.

Ce qui me manque ici?

178voto

kostix Points 11762

Depuis le temps qu' git cherry-pick appris à être en mesure d'appliquer de multiples s'engage, la distinction est en effet devenu un peu discutable, mais c'est quelque chose d'être appelé à une évolution convergente ;-)

La vraie distinction réside dans l'intention originale pour créer à la fois des outils:

  • git rebase's est la tâche de l'avant-port par une série de changements, un développeur a dans son repository privé, créé avec la version X de certains amont de la branche, à la version Y de la même branche (Y > X). Effectivement cela change la base de cette série de commits, d'où l'expression "année de référence".

    (Il permet aussi au développeur de greffe d'une série de commits sur tout arbitraire, de commettre, mais c'est de moins en moins évidente.)

  • git cherry-pick est pour apporter une intéressante engageons à partir d'une ligne de développement à un autre. Un exemple classique est le portage d'un correctif de sécurité faite sur l'instabilité de la direction du développement de la stabilité (entretien) de la branche, où une opération de fusion n'a pas de sens car elle permettrait d'apporter beaucoup de changements inutiles.

    Depuis sa première apparition, git cherry-pick appris à être en mesure de prendre plusieurs engage à la fois, un par un.

D'où, probablement la différence la plus frappante entre ces deux commandes est la façon dont ils traitent la branche sur laquelle ils travaillent sur: git cherry-pick apporte généralement un commit à partir de quelque part d'autre et l'applique sur le haut de votre branche actuelle, l'enregistrement d'un nouveau commit, alors que git rebase prend votre branche courante et réécrit une série de son propre conseil s'engage d'une manière ou d'une autre. Oui, c'est un très abrutir description de ce qu' git rebase pouvez le faire, mais c'est intentionnel, pour essayer de faire au moins une idée générale de l'évier dans.

Mise à jour pour expliquer plus en détail un exemple de l'utilisation de git rebase en cours de discussion.

Compte tenu de cette situation,
a state of the repo before rebasing
Le Livre dit:

Cependant, il est une autre façon: vous pouvez prendre le patch de la modification qui a été introduite en C3 et la remettre sur le dessus de C4. Dans Git, cela s'appelle de la relocalisation. Avec la commande rebase, vous pouvez prendre toutes les modifications qui ont été commis sur une branche et les relire sur un autre.

Dans cet exemple, exécutez la commande suivante:

$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command

"Le catch" ici, c'est que dans cet exemple, l ' "expérience" de la branche (le sujet du changement d'année de base) a été à l'origine initiés par le "maître" de la branche, et par conséquent les actions s'engage C0 à travers C2 avec elle — effectivement, "l'expérimentation" est "maître" jusqu'à, et y compris, C2 plus commettre C3 sur le dessus de cela. (C'est le plus simple possible; bien sûr, "expérience" peut contenir plusieurs dizaines de commits sur le dessus de son socle d'origine.)

Maintenant, git rebase est dit de rebase "expérience" sur l' actuel conseil de "maître", et git rebase va comme ceci:

  1. S'exécute git merge-base pour voir ce qui est le dernier commit partagé à la fois par "l'expérience" et "maître" (ce qui est le point de détournement, en d'autres termes). C'est C2.
  2. Enregistre l'écart de tous les commits réalisés depuis le détournement point; dans notre exemple jouet, c'est juste de la C3.
  3. Rembobinage de la TÊTE (qui pointe à la pointe de commettre de "l'expérience" avant le début de l'opération à exécuter) à pointer le bout de "maître" — nous sommes complet sur elle.
  4. Essaie d'appliquer chacun des sauvés s'engage (comme si avec git apply) dans l'ordre. Dans notre exemple jouet c'est juste un commit, C3. Disons que son application va produire un commit C3".
  5. Si tout s'est bien passé, l ' "expérience" de référence est mis à jour pour pointer à la livraison résulte de l'application de la dernière version enregistrée commit (C3 " dans notre cas).

Maintenant, revenons à votre commentaire. Comme vous pouvez le voir, ici techniquement git rebase , en effet, les greffes d'une série de commits de "l'expérience" à la pointe de "maître", de sorte que vous pouvez légitimement dire qu'il y est en effet "une autre branche" dans le processus. Mais l'essentiel est que la pointe s'engager à partir de "l'expérience" a fini par être le nouveau conseil s'engager dans "l'expérience", il a juste changé son socle:
state after merging

Encore une fois, techniquement, vous pouvez dire qu' git rebase ici incorporé certains s'engage à partir de "maître", et ce qui est absolument correcte.

109voto

Kenny Ho Points 355

Avec cherry-pick, l'original s'engage/branche autour de bâtons et de nouveaux commits sont créés. Avec cela, l'ensemble de la direction est déplacé avec la direction de pointage de l'relus s'engage.

Disons que vous avez commencé avec:

      A---B---C topic
     /
D---E---F---G master

Rebase:

$ git rebase master topic

Vous obtenez:

              A'--B'--C' topic
             /
D---E---F---G master

Cherry-pick:

$ git checkout master -b topic_new
$ git cherry-pick A^..C

Vous obtenez:

      A---B---C topic
     /
D---E---F---G master
             \
              A'--B'--C' topic_new

pour plus d'informations sur git ce livre a plus de (http://git-scm.com/book)

18voto

iltempo Points 7276

La cueillette fonctionne pour des commits individuels .

Lorsque vous redéfinissez la base, tous les commits de l'historique sont appliqués au HEAD de la branche qui y manque.

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