Ajouter des modifications à un ancien commit
La commande rebase
est très pratique pour réécrire son historique local, au point de pouvoir reordonner les commits ou d'en fusionner (on emploiera le terme "squash").
Aussi, la commande commit
est pratique avec l'option --amend
pour ajouter des modifications au dernier commit.
Un commit fixup suivi d'un rebase
permettra de mélanger les 2 comportements décrits plus haut: ajouter des changements à un ancien commit (qui n'est pas nécessairement le dernier).
1. Commit
Commencer par ajouter les modifications au staging:
git add commit/staging.md
Puis créer un commit avec l'option --fixup
en ciblant le commit auquel ajouter les modifications:
git commit --fixup=bbd7c93
[output][master 3437913] fixup! Ajoute une documentation sur le staging
[output] 1 file changed, 6 insertions(+)
Résultat:
2. Rebase
Effectuer maintenant un rebase
, avec les options --interactive
et --autosquash
:
git rebase --interactive --autosquash bbd7c93^
L'option --autosquash
va automatiquement placer le commit fixup dans l'historique réécrit pour qu'il soit fusionné avec le commit cible:
pick bbd7c93 Ajoute une documentation sur le staging
fixup 3437913 fixup! Ajoute une documentation sur le staging
pick fff3c3f Ajoute une feuille de triche
pick daaad19 Ajoute un conseil au README
# Rebase d91d190..3437913 onto daaad19 (4 commands)
# ...
Représentation:
Après rebase
, le commit fixup aura été fusionné au commit cible.
Résultat:
Attention:
rebase
va réécrire l'historique (les hashs des commits suivant le "fixup" ont changé). Ne jamais réécrire l'historique qui a déjà été partagé avec votre équipe ! Ce type d'opération est à réaliser uniquement pour les commits locaux.
Partie pratique
-
Modifier le fichier
commit/staging.md
et enregistrer les modifications sur l'ancien commit auquel le fichier a été créé. -
Annuler le commit qui ajoutait le fichier
commit/commit.md
. -
Créer un fichier
cancel.md
dans lequel résumer ce que vous avez retenu des techniques d'annulations avec Git. Ajouter le fichier dans un nouveau commit.