Depuis que le temps a git cherry-pick
appris à pouvoir appliquer plusieurs commits, la distinction est en effet devenue quelque peu théorique, mais c'est quelque chose qu'on appelle une évolution convergente ;-)
La véritable distinction réside dans l'intention initiale de créer les deux outils:
git rebase
La tâche du développeur est de transférer une série de changements qu'un développeur a dans son référentiel privé, créés contre la version X d'une branche amont, vers la version Y de cette même branche (Y> X). Cela change effectivement la base de cette série de commits, d'où le «rebasage».
(Cela permet également au développeur de transplanter une série de commits sur n'importe quel commit arbitraire, mais c'est d'une utilité moins évidente.)
git cherry-pick
est pour amener un commit intéressant d'une ligne de développement à une autre. Un exemple classique est le rétroportage d'un correctif de sécurité effectué sur une branche de développement instable vers une branche stable (maintenance), où a merge
n'a aucun sens, car cela entraînerait de nombreux changements indésirables.
Depuis sa première apparition, git cherry-pick
a pu choisir plusieurs commits à la fois, un par un.
Par conséquent, la différence la plus frappante entre ces deux commandes est peut-être la manière dont elles traitent la branche sur laquelle elles travaillent: git cherry-pick
apporte généralement un commit d'un autre endroit et l'applique au-dessus de votre branche actuelle, enregistrant un nouveau commit, tandis que git rebase
prend votre branche actuelle et réécrit une série de son propre tip s'engage d'une manière ou d'une autre. Oui, c'est une description très stupide de ce qui git rebase
peut faire, mais c'est intentionnel, d'essayer de faire pénétrer l'idée générale.
Mettre à jour pour expliquer plus en détail un exemple d'utilisation en git rebase
cours de discussion.
Compte tenu de cette situation,
The Book déclare:
Cependant, il existe un autre moyen: vous pouvez prendre le patch du changement qui a été introduit dans C3 et le réappliquer par-dessus 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 branche et les appliquer sur une autre.
Dans cet exemple, vous exécuteriez ce qui suit:
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
"Le hic" ici est que dans cet exemple, la branche "expérimentation" (le sujet du rebasage) a été à l'origine bifurquée de la branche "maître", et par conséquent, elle partage les commits C0 à C2 avec elle - effectivement, "expérience" est " master "jusqu'à, et y compris, C2 plus engager C3 par-dessus. (C'est le cas le plus simple possible; bien sûr, "experiment" pourrait contenir plusieurs dizaines de commits en plus de sa base d'origine.)
Il git rebase
est maintenant dit de rebaser "experiment" sur la pointe actuelle de "master", et git rebase
va comme ceci:
- S'exécute
git merge-base
pour voir quel est le dernier commit partagé à la fois par "experiment" et "master" (quel est le point de diversion, en d'autres termes). C'est C2.
- Enregistre tous les commits effectués depuis le point de diversion; dans notre exemple de jouet, c'est juste C3.
- Rembobine le HEAD (qui pointe vers le commit tip de "experiment" avant que l'opération ne commence à s'exécuter) pour pointer vers le bout de "master" - nous rebasons dessus.
- Tente d'appliquer chacun des commits enregistrés (comme avec
git apply
) dans l'ordre. Dans notre exemple de jouet, il ne s'agit que d'un seul commit, C3. Disons que son application produira un commit C3 '.
- Si tout s'est bien passé, la référence "expérience" est mise à jour pour pointer vers le commit résultant de l'application du dernier commit enregistré (C3 'dans notre cas).
Revenons maintenant à votre question. Comme vous pouvez le voir, ici, techniquement, en git rebase
effet, transplante une série de commits de "experiment" à la pointe de "master", donc vous pouvez à juste titre dire qu'il y a effectivement "une autre branche" dans le processus. Mais l'essentiel est que le commit tip de "experiment" a fini par être le nouveau commit tip dans "experiment", il a juste changé sa base:
Encore une fois, techniquement, vous pouvez dire git rebase
qu'ici incorporé certains commits de "master", et c'est tout à fait correct.