Dernière modification: 2018-08-27 09:56


Revenons aux bases: Git.

Ce puissant outil de gestion de versions est largement sous-estimé par les nouveaux venus car « Oh, wow, c'est super dur de comprendre quelle est la différence entre git pull origin main et git merge origin/main, et puis de toute façon c'est quoi ce "/" au milieu ? »

Oui, je trolle un peu, mais en fait, il y a quelque chose de génial que nous pouvons faire et qui est très simple quand on sait ce que c'est : rebase.

Commençons avec ça :

* 33facc8  (main) Commit 3
|
| * 3b36f32  (second_branch) Commit détaché
| |
|/
* 29af11f  Commit 2
|
* 1439f8e  Commit 1

Nous travaillerons sur la branche second_branch, qui est créée sur la base d'une version précédente de la branche main. La branche second_branch a un commit de plus que main. Mais, entre temps, quelqu'un s'est mis à travailler sur main et a rajouté des commits.

Nos branches divergent.

Problème : j'ai besoin des modifications de Commit 3 pour travailler sur ma branche (ou alors mon équipe veut que je garde toujours mon code à jour avec main).

Deux possibilités ici :

  • Utiliser merge (ou pull pour les paresseux, puisque c'est juste un alias de fetch + merge).
  • Utiliser rebase.

Rappel : nous travaillons sur second_branch. Cela signifie que nous avons préalablement exécuté la commande git checkout second_branch.

Si vous avez besoin d'une meilleure représentation, vous pouvez jeter un oeil sur google images pour quelques graphiques de ce que produit un "rebase". C'est joli (oui, j'aime les graphes).

Résumé

git merge {branch}

Applique les modifications de la branche {branch} à la branche courante, et si les branches divergent (ou que l'option --no-ff est spécifiée), Git créera un nouveau "commit de merge" indiquant que les deux branches ont été fusionnées.

git rebase {branch}

Réécrit l'historique actuel de la branche. Dans un premier temps, il garde tous les "nouveaux commits" de la branche courante (en commençant par HEAD) en mémoire, puis applique tous les commits "manquants" de la branche {branch} (qui devrait de toute façon fast-forward), et enfin applique les modifications de la branche courante qui sont en mémoire une par une, jusqu'à ce que chaque conflit (s'il y en a) soit résolu, et change les hash des nouveaux commits.

Et rebase n'est qu'un seul des nombreux composant de Git.

Regardez aussi les commandes for-each-ref ou log, vous pouvez faire des trucs géniaux avec !

Git merge vs rebase