Git cherry pick vs rebase

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

En parcourant le livre en ligne ( livre Git ), j’ai trouvé ce qui suit dans la section “Git Rebase”:

Avec la commande rebase, vous pouvez prendre toutes les modifications qui ont été validées sur une twig et les relire sur une autre.

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

J’ai pensé que c’était la définition exacte de git cherry-pick (réappliquez un commit ou un ensemble d’objects commit sur la twig actuellement extraite).

Quelle est la différence entre les deux ?

Puisque le temps git cherry-pick appris à pouvoir appliquer plusieurs commits, la distinction est devenue quelque peu discutable, mais il s’agit de quelque chose à appeler évolution convergente 😉

La véritable distinction réside dans l’intention originale de créer les deux outils:

  • La tâche de git rebase est de transférer une série de modifications qu’un développeur a apscopes à son repository privé, créé contre la version X de certaines twigs en amont, vers la version Y de cette même twig (Y> X). Cela modifie effectivement la base de cette série de commits, et par conséquent “rebasage”.

    (Cela permet également au développeur de transplanter une série de commits sur un commit arbitraire, mais cela est moins évident.)

  • git cherry-pick est pour apporter un engagement intéressant d’une ligne de développement à une autre. Un exemple classique est le backporting d’un correctif de sécurité créé sur une twig de développement instable vers une twig stable (maintenance), où une merge n’a pas de sens, car elle entraînerait de nombreuses modifications indésirables.

    Depuis sa première apparition, git cherry-pick a été en mesure de sélectionner plusieurs commits à la fois, un par un.

Par conséquent, la différence la plus frappante entre ces deux commandes réside dans la manière dont elles traitent la twig sur laquelle elles fonctionnent: git cherry-pick apporte généralement un commit d’ailleurs et l’applique au-dessus de votre twig actuelle, enregistrant un nouveau commit pendant que git rebase prend votre twig actuelle et réécrit une série de ses propres commits d’une manière ou d’une autre. Oui, cette description de ce que git rebase peut faire est très approximative, mais il est intentionnel, pour essayer de faire entrer l’idée générale.

Mise à jour pour expliquer un exemple d’utilisation de git rebase cours de discussion.

Compte tenu de cette situation,
un état du repo avant de rebasage
Le livre dit:

Cependant, il existe un autre moyen: vous pouvez prendre le patch du changement introduit dans C3 et le réappliquer sur C4. Dans Git, cela s’appelle le rebasage. Avec la commande rebase, vous pouvez prendre toutes les modifications qui ont été validées sur une twig et les appliquer à une autre.

Dans cet exemple, vous exécutez les opérations suivantes:

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

“Le catch” est que dans cet exemple, la twig “experiment” (le sujet du rebasage) était à l’origine issue de la twig “master”, et par conséquent elle partage avec C0 à C2 – effectivement, “experiment” est ” master “jusqu’à, y compris C2 plus commit C3 par-dessus. (C’est le cas le plus simple possible, bien sûr, “expérience” pourrait contenir plusieurs dizaines de commits au-dessus de sa base d’origine.)

Maintenant, git rebase est invité à rebaser “experiment” sur la pointe actuelle de “master”, et git rebase se présente comme suit:

  1. Les exécutions git merge-base pour voir quel est le dernier commit partagé à la fois par “experiment” et “master” (quel est le but de la diversion, en d’autres termes). Ceci est C2.
  2. Enregistre tous les commits faits depuis le sharepoint diversion; Dans notre exemple de jouet, c’est juste C3.
  3. Rembobine le HEAD (qui pointe sur le commit de pointe de “experiment” avant que l’opération ne commence à s’exécuter) pour pointer le bout de “master” – nous le rebasons.
  4. Essaie d’appliquer chacun des commits enregistrés (comme si avec git apply ) dans l’ordre. Dans notre exemple de jouet, il n’y a qu’un seul engagement, C3. Disons que son application produira un commit C3 ‘.
  5. Si tout s’est bien passé, la référence “experiment” est mise à jour pour indiquer la validation résultant de l’application de la dernière validation enregistrée (C3 ‘dans notre cas).

Revenons maintenant à votre question. Comme vous pouvez le voir, techniquement, git rebase transplante en effet une série de commits de “experiment” à la pointe de “master”, donc vous pouvez dire à juste titre qu’il y a bien “une autre twig” dans le processus. Mais l’essentiel est que le commit de “experiment” a fini par être le nouvel commit de “experiment”, il a juste changé sa base:
état après fusion

Encore une fois, techniquement, vous pouvez dire que le git rebase incorporé ici certains commits de “master”, et ceci est absolument correct.