Conserver un historique git propre
Le plus simple, c'est d'apprendre à utiliser git rebase et de configurer git pour faire ses git pull en utilisant plutot un rebase qu'un merge.
Voila comment configurer git : git config --global pull.rebase true
Pas convaincu ?
Exemple simpliste
Ça commence connement… Je git push quelques commits et le serveur m'envoit péter :
1 2 3 4 5 6 7 8 | $ git push To git@gitlab.com:debona/debona_fr.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'git@gitlab.com:debona/debona_fr.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. |
Voila ! C'est la base, quelqu'un a commit avant moi. Nous sommes donc dans cette situation (mes commits sont en orange) :
Si je fais un git pull, par défaut git va me créer un commit de merge. Voila ce qu'on va obtenir (commit de merge en gris) :
Ce commit de merge n'apporte strictement rien à l'historique du code. Pire encore, on peut vite assister à un festival des commits de merge lorsqu'on travail à plusieur sur la même branche. Bref, c'est une véritable pollution de l'historique du dépot.
En choisisant de résoudre ses pull par un rebase, on demande à git de rejouer nos commits par dessus ceux récupérés.
Cela permet de conserver un historique linéaire :
Et comment ça ce passe quand il y a un conflit ?
Personnellement, je préfère gérer les conflits lors d'un rebase que lors d'un merge.
Quand on rencontre un conflit lors d'un gros merge on est vite noyé sous la tonne de modifications.
L'avantage du rebase c'est qu'en rejouant nos commits, on va rélger les conflits en plusieurs étapes.
Bien sûr, il faut d'abord apprendre à utiliser git rebase avant de se lancer le pull rebase.
NB
Il ne faut pas voir cette astuce comme un git-flow. Il s'agit simplement d'une manière de gérer les pull différente de celle par défaut.
Pour moi, c'est un complément indispensable.
Quelque soit le git-flow suivi, il arrivera un moment ou un dévelopeur fera un pull sans avoir la dernière version.
Il aura alors l'opportunité de polluer l'historique, ou de conserver un historique linéaire.