Corriger un commit Git erroné sur une branche stable

vendredi 25 décembre 2020

Lors du développement, il arrive qu'on applique un commit contenant une coquille. La plupart du temps, quand je travaille sur une branche de fonctionnalités, j'aime bien corriger cette coquille avec un rebasage interactif, c.-à-d. git rebase --interactive [options]. Cependant, si cette coquille a déjà été appliquée sur une branche stable, il faut trouver un autre moyen — sans rebasage interactif — car l'historique des commits ne doit pas être réécrit. La solution la plus évidente est la création d'un nouveau commit, lequel vient corriger ladite coquille. Ce commit sera par la suite appliqué sur la branche stable.

Pour créer ce commit, j'aime bien utiliser commit --fixup.

       --fixup=<commit>
           Construct a commit message for use with rebase --autosquash. The
           commit message will be the subject line from the specified commit
           with a prefix of "fixup! ". See git-rebase(1) for details.

Comme décrit dans sa documentation, commit --fixup est supposé être utilisé en tandem avec rebase --autosquash. Dans notre situation, c'est hors sujet.

L'avantage de commit --fixup est le suivant : le titre du commit à réparer est automatiquement réferencé dans le titre du commit réparant. Cela simplifie tout le travail d'archéologie quand il s'agit de comprendre des changements introduits dans une base de code.

$ git log --oneline
* zzzzzzz some noise
* yyyyyyy fixup! This commit contains a typo
[...]
* ddddddd even more noise
* ccccccc more noise
* bbbbbbb noise
* aaaaaaa This commit contains a typo

Cette fonctionnalité peut être améliorée en ajoutant le hash du commit réparé dans le corps du message du commit réparant. Ce comportement est similaire à celui de git revert.

fixup! This commit contains a typo

This fixes commit aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.

Afin de simplifier tout ce processus, j'ai écrit un alias Git :

# ~/.gitconfig
[alias]
    fixup = !sh -c 'git commit -m \"This fixes commit $(git rev-parse $1).\" --fixup \"$@\"' -

Vous pouvez probablement comprendre le fonctionnement de l'alias par vous même. La seule subtilité est qu'un shell est invoqué afin d'appeler git rev-parse. De cette manière, n'importe quel type de révision peut être fourni à la commande git fixup, p. ex. :

$ git fixup zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz [options]  # hash long (40 caractères)
# ou bien
$ git fixup zzzzzzz [options]  # hash court (7 caractères)
# ou bien
$ git fixup HEAD~42 [options]  # spécificateur plus complexe

Conclusion

Copiez-collez cet alias ; faites-en ce que vous voulez. C'est mon cadeau de Noël.

Toute ma configuration Git est trouvable ici — avec entre autres, l'énumération de mes alias personnels.


Profile picture

Blog personnel de Bryton Lacquement.
Leader technique. Coincé dans Vim. Sûrement nerd.