Gardez votre historique de référentiel Git propre en écrasant les commits
Vous en avez assez des historiques de commit désordonnés qui encombrent vos dépôts Git et vos pull requests ? Heureusement, Git a la capacité de « squash commits », qui fusionne plusieurs petits commits en un seul. Cela permet de garder votre historique de code propre et organisé, et c’est facile à faire avec quelques commandes.
Sommaire
Pourquoi Squash s’engage ?
L’une des règles d’or de la bonne étiquette Git est de s’engager souvent avec de bons messages expliquant ce que font les commits. Cependant, cela peut rapidement devenir un problème si trop de commits sont poussés. Après tout, personne ne veut revoir une pull request avec 40 commits différents, tous prêts à être fusionnés dans master – c’est tout simplement trop encombrant.
Donc, avant de pousser vers un référentiel distant comme GitHub, il est recommandé de squash ces commits, qui les fusionneront tous en un seul grand commit. Tous les messages de commit de ces commits seront ajoutés au « squash commit » afin qu’ils soient toujours tous visibles lorsque vous allez les pousser vers GitHub ou soumettre votre pull request.
Il n’est pas toujours nécessaire non plus d’écraser chaque validation, car il est parfois agréable de diviser les choses si vous travaillez sur plusieurs fichiers ou parties du référentiel différents. Cependant, si vous apportez simplement plusieurs modifications à un seul fichier au fil du temps, vous devriez probablement écraser ces validations.
Il est important de noter que vous ne pouvez pas écraser les commits déjà poussés vers GitHub sans force de poussée, ce qui est une opération destructrice. L’écrasement des commits écrase l’historique de Git, ce qui est bien si vous le faites uniquement sur votre machine locale. Si vous le faites sur GitHub, cela nécessite une poussée forcée, ce qui signifie que tous les membres de votre équipe doivent recloner le référentiel pour éviter les conflits.
Pour éviter ces problèmes, il est préférable d’écraser les commits avant de pousser vers le référentiel distant. Comme c’est généralement le moment où vous voudriez le faire de toute façon, ce n’est généralement pas un problème.
Écraser les commits Git avec git merge
Il existe plusieurs façons d’écraser les commits, car il n’y a pas de « git squash
» commande. L’une des plus simples consiste à utiliser git merge
avec le --squash
drapeau. Cette technique fusionnera les N derniers commits en un seul.
Tout d’abord, vous devez vous assurer que votre référentiel est entièrement propre, sans modifications actives. Tu peux vérifier git status
pour vérifier que vous n’avez aucune modification locale qui serait rejetée par la réinitialisation.
Ensuite, vous voudrez réinitialiser la branche à la position où elle se trouvait avant n’importe lequel des commits que vous aimeriez écraser ensemble. Par exemple, pour écraser les trois derniers commits, vous utiliseriez HEAD~3
qui est techniquement le quatrième commit de l’historique, mais supprimera les trois commits squashables de votre historique.
git reset --hard HEAD~3
Vous pouvez également utiliser un hachage SHA-1 de validation pour référencer directement une validation. Ensuite, nous courons git merge --squash
la cible de fusion étant HEAD@{1}
qui est la position de HEAD avant la dernière commande.
git merge --squash 'HEAD@{1}'
Git a déjà mis en scène toutes les modifications avec le message de validation approprié à ce stade, mais il doit être validé :
git commit
Une fois cela fait, vous êtes libre de pousser tous les commits vers votre référentiel source en amont.
Plus de contrôle sur l’écrasement avec le rebase interactif
Si vous ne voulez pas tout écraser en un bit commit, vous pouvez effectuer un rebase interactif pour sélectionner uniquement les commits que vous souhaitez écraser. Le rebasage peut être compliqué, mais c’est facile à faire avec les bonnes étapes.
Tout d’abord, démarrez le rebase interactif en ciblant le commit avant le dernier commit squashable :
git rebase -i HEAD~3
Cela ouvrira un éditeur de texte, où vous voudrez changer « pick » en « squash » pour chaque commit que vous souhaitez fusionner.
Git ouvrira alors un autre éditeur, vous permettant de créer un nouveau message de commit pour le commit combiné. Enregistrez ceci et le rebase devrait se terminer.
Rebaser de cette manière fusionnera tous les commits écrasés dans le prochain commit au-dessus d’eux. Dans ce cas, les deuxième et troisième commits ont été fusionnés dans le premier.
Écraser les commits Git avec une interface graphique Git
Comme la plupart des actions dans Git, écraser les commits avec une interface est beaucoup plus facile que de se souvenir et de taper des commandes à chaque fois. En fait, dans GitKraken, vous pouvez simplement contrôler-cliquer sur les commits que vous souhaitez écraser, et faire un clic droit pour appuyer sur « Squash 2 commits »:
Vous pouvez lire notre guide sur les clients GUI Git pour en savoir plus.