Comment fusionner plusieurs commits en un seul dans Git

Banner Nasio Themes French

Voyez comment combiner deux commits en un seul dans Git en utilisant rebase interactif, Git bash, et Vim.

Dans notre dernier tutoriel, nous avons montré comment supprimer un commit dans Git, afin qu’il n’apparaisse plus dans l’historique Git. Ici, nous allons examiner une approche similaire pour fusionner (squasher) plusieurs petits commits en un seul plus grand.

Il peut arriver que vous souhaitiez manipuler l’historique Git. Un historique clair permet à vos collègues de comprendre plus facilement ce qui se passe avec votre code. Au contraire, un historique Git désordonné laissera vos collègues perplexes sur ce que vous avez fait et peut même conduire à la frustration et à des sentiments et pensées négatifs. Il est donc toujours préférable de conserver un historique Git propre et concis que tout le monde peut comprendre. Dans ce cas particulier, nous allons voir comment combiner deux petits commits en un seul dans Git. Vous avez peut-être essayé d’introduire une nouvelle fonctionnalité, mais vous n’avez fait que la moitié du travail dans le premier commit, et vous avez terminé le travail dans le second. Pendant que vous faisiez le travail, cela vous a probablement semblé être une bonne idée, mais maintenant, quand vous y réfléchissez, cela n’a plus de sens, et vous auriez aimé garder les choses dans un seul commit. Eh bien, j’ai de bonnes nouvelles pour vous ! Vous pouvez facilement combiner plusieurs commits dans Git en utilisant la ligne de commande Git et Vim. Dans une minute, je vous montrerai comment faire, mais maintenant, faisons un petit rafraîchissement sur la terminologie que nous allons utiliser ci-dessous. N’hésitez pas à le sauter, si vous le souhaitez, mais je préfère le garder ici pour référence.

Historique de Git

Aussi explicite que possible, l’historique Git est l’historique de vos commits. Une façon simple de voir une représentation graphique de vos commits est de lancer la commande suivante dans Git bash :

git log --oneline

Cette commande vous fournira une liste des commits sur une branche donnée, du plus récent au plus ancien.

Rebase intéractif

La base interactive est un outil puissant qui doit être utilisé par des personnes qui savent ce qu’elles font. Il s’agit d’une arme mortelle qui ne doit pas être confiée à la mauvaise personne. Cependant, le rebase interactif est exactement ce dont nous avons besoin dans cette situation. Il vous permet de manipuler l’historique de Git de toutes les manières possibles.

Vim

Vim est l’éditeur de texte par défaut de Git bash. Ce tutoriel suppose que vous utilisez Vim comme éditeur Git bash. Si pour une raison quelconque, vous ne l’utilisez pas, c’est le bon moment pour le faire :

git config --global core.editor "vim"

NB : Vim est un outil préhistorique, un éditeur de texte au moins aussi puissant que la méthode rebase (peut-être beaucoup plus). Il est extrêmement vieux et peu intuitif, mais il fonctionne bien dans cette situation (ainsi que dans beaucoup d’autres, à condition de savoir ce que l’on fait). Vous êtes prévenu.

Fusionner des commits dans Git

Après avoir vérifié votre historique Git avec la commande log et déterminé les commits que vous voulez écraser (disons que vous avez trois commits au total et que vous voulez fusionner votre deuxième et troisième commit le plus récent)

Ouvrez le bash Git et ajoutez la commande suivante :

git rebase -i HEAD~3

Ceci déclenchera l’éditeur vim et affichera les trois derniers commits sur une branche donnée.

Illustration 1: Rebase intéractif dans Vim

Pour squasher les commits se terminant par 283 et 706, appuyez sur i et supprimez le texte « pick » du second commit et remplacez-le par « s » :

Illustration 2: Squasher un commit dans Vim

Cela fusionnera le deuxième commit dans le troisième afin de combiner les deux commits en un seul. Pour faire le squash, quittez le mode visuel en appuyant sur Esc et tapez :wq pour sauvegarder et quitter Vim.

Cela vous mènera à l’écran final de Vim, qui vous indique que les deux commits seront combinés et vous donne la possibilité de modifier le texte du message de validation. Si vous êtes satisfait du message actuel, vous pouvez quitter l’écran en appuyant sur :q

Illustration 3 : Édition d’un message de validation dans Vim

Voilà, c’est fait. Vous avez réussi à fusionner les commits 8cac706 et b159283 en un seul. N’oubliez pas de pousser les changements avec la commande suivante :

git push origin +branch

Vous devez utiliser force puisque vous avez réussi à manipuler l’historique git sur votre branche locale.

PS : Vous pouvez toujours annuler le rebase en utilisant la commande suivante au cas où le rebase se déroulerait mal pour une raison ou une autre :

git rebase --abort

Bon codage !