lundi 30 janvier 2012

[Git] Rejouer l'historique pour le modifier

... ou comment ajouter du contenu sur un commit qui n'est pas le dernier de la branche.

Les opérations suivantes ne suffiront pas pour propager le nouveau contenu jusqu'à la référence de la branche : se déplacer sur un commit antérieur (git checkout), ajouter du contenu (git add) et modifier le commit (git commit --amend). Cela aura pour seul effet de créer une nouvelle branche sans référence, car Git ne modifie pas des objets existants.
Il faut donc rejouer tous les commits depuis le commit à modifier jusqu'au dernier commit de la branche, afin de reconstruire celle-ci :
git rebase -i <commit> pour un rebase interactif depuis le commit indiqué.
Git guide ensuite l'utilisateur.

Dans l'éditeur ouvert par Git, remplacer, pour le commit à modifier, la commande "pick" par la commande "edit" sur la ligne correspondante, puis quitter l'éditeur. Le déroulement du rebase est suspendu en arrivant sur le commit à modifier : c'est le moment d'ajouter le contenu souhaité.
git add <fichier(s)> pour modifier l'index.
git commit --amend pour modifier le dépôt local.
git rebase --continue afin de poursuivre le rebase.
En lisant l'historique des commits de la branche pour le fichier modifié (git log --stat -- <fichier>) ou en ouvrant ce fichier, on voit que les modifications du commit intermédiaire ont été conservées, ce qui ne serait pas le cas sans un rebase.

Aucun commentaire: