Manipuler l'historique peut parfois s'avérer utile pour corriger un commit mal effectué mais aussi pour préparer une branche avant la fusion.
amend
L'argument --amend
permet de rajouter les fichier en staging dans le commit précédent. Ceci permet de corriger un oubli et d'éviter de faire 10 commits pour la même chose.
git commit --amend
Il est important de ne jamais amend un commit déjà publié au risque de rendre compromettre l'historique de tout le monde. A n'utiliser que pour des petits oublis en local.
rebase
Comme son nom l'indique rebase permet de déplacer une branche et de changer son commit de départ (sa base). Un petit schéma pour mieux comprendre :
Dans le principe c'est très simple, on déplace nos 2 commits. En revanche git va réécrire l'historique, supprimer nos anciens commits et recréer 2 nouveau commits à partir de la nouvelle base (comprendre par là que les commits changent d'ID)
git rebase <nouvelle-base>
Permet de changer la base de la branche courante pour la<nouvelle-base>
.
Pourquoi Rebase ?
On peut se demander à quoi peut servir une telle opération. Le rebase va nous être utile pour forcer un fast-forward lors d'une fusion de branche. Reprenons le cas d'une branche que l'on souhaite fusionner :
Le problème ici, c'est qu'un merge entrainera un 3-way merge qui va générer un nouveau commit de fusion et qui rendra l'historique plus complexe à lire. Le rebase va alors nous permettre de se placer dans un cas propice à un fast-forward.
git checkout feature # On va sur la branche feature
git rebase master # Notre branche commencera au bout de master
git checkout master # On retourne sur master
git merge feature # On fusionne feature et master
Et pour ceux qui préfèrent les images.
On voit ici qu'un rebase nous permet de garder un historique simple et linéraire qui sera plus simple à comprendre.
rebase -i
Le drapeau -i permet de déclencher un rebase interactif. Ce mode nous permet de guider git dans son rebase et de lui dire comment organiser les nouveaux commits.
git rebase -i <nouvelle-base>
Cette commande va ouvrir un éditeur nous permettant de dire à git comment réorganiser les différents commit à partir de la nouvelle base
- pick, permet de d'inclure le commit. On peut en profiter pour changer l'ordre des différents commit
- reword, permet d'inclure le commit tout en ayant la possibilité de changer le message
- edit, permet d'éditer le commit. En séparant en plusieurs commits par exemple
- squash, combine le commit avec le commit du dessus et permet de changer le message du commit
- fixup, comme squash mais utilisera le message du commit situé au dessus
- exec, permet de lancer des commandes shell sur le commit
Bien que très très très très très très très fooooortement déconseillé on peut utiliser le rebase interactif pour modifier l'historique de la branche en cours
git rebase -i HEAD~6
Permet par exemple de modifier les 6 derniers commits.