Vous pouvez aussi recombiner (rebase) les commits interactivement. Ceci s'utilise souvent pour ré-écrire vos objets commits avant de les publier. C'est une manière simple de découper, regrouper et ré-ordonner les commits avant de les partager avec les autres. Vous pouvez aussi utiliser ça pour nettoyer les commits que vous récupérerez chez quelqu'un avant de les appliquer localement.
Si vous voulez modifier interactivement vos commit durant la recombinaison, vous pouvez activer le mode interactif en utilisant l'option '-i' ou '--interactive' avec la commande 'git rebase'.
$ git rebase -i origin/master
Cela lancera le mode interactif de recombinaison, avec tous les commits que vous avez créé depuis votre dernière publication (ou le dernier merge depuis le dépôt d'origine).
Pour voir quels commits seront concernés, vous pouvez utiliser la commande 'log' de cette façon:
$ git log github/master..
Quand vous lancerez la commande 'rebase -i', vous vous trouverez dans un éditeur qui ressemblera à ça:
pick fc62e55 added file_size
pick 9824bf4 fixed little thing
pick 21d80a5 added number to log
pick 76b9da6 added the apply command
pick c264051 Revert "added file_size" - not implemented correctly
# Rebase f408319..b04dc3d onto f408319
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Cela signifie qu'il y a 5 commits depuis votre dernière publication et chaque commit est décrit par un ligne avec le format suivant:
(action) (sha partiel) (court message du commit)
Maintenant, vous pouvez changer l'action (qui est 'pick' par défaut) soit par 'edit', ou 'squash', ou juste la laisser comme elle est ('pick'). Vous pouvez aussi ré-ordonner les commits en déplaçant les lignes comme vous le voulez. Ensuite, quand vous sortez de l'éditeur, git essayera d'appliquer les commits en suivant leur ordre d'arrangement et l'action sélectionnée.
Si 'pick' est sélectionné, il essayera simplement d'appliquer le patch et de sauvegarder le commit avec le même message qu'avant.
Si 'squash' est sélectionné, il combinera ce commit avec le précédent pour former un nouveau commit. Vous trouverez alors un autre éditeur pour merger les messages des 2 commit qui ont étés assemblés ensemble. Donc, si vous sortez du premier éditeur de la manière suivante:
pick fc62e55 added file_size
squash 9824bf4 fixed little thing
squash 21d80a5 added number to log
squash 76b9da6 added the apply command
squash c264051 Revert "added file_size" - not implemented correctly
vous devrez créer un nouveau message de commit partir de ça:
# This is a combination of 5 commits.
# The first commit's message is:
added file_size
# This is the 2nd commit message:
fixed little thing
# This is the 3rd commit message:
added number to log
# This is the 4th commit message:
added the apply command
# This is the 5th commit message:
Revert "added file_size" - not implemented correctly
This reverts commit fc62e5543b195f18391886b9f663d5a7eca38e84.
Une fois que vous aurez édité cette partie en un seul message et quitté l'éditeur, le commit sera sauvegardé avec votre nouveau message.
Si vous avec sélectionné 'edit', la même chose se passera, mais un pause sera marqué entre chaque commit pour vous donner la main avec une ligne de commande afin que vous puissiez modifier le commit, ou son contenu.
Par exemple, si vous voulez découper un commit, vous sélectionnerez 'edit' pour ce commit:
pick fc62e55 added file_size
pick 9824bf4 fixed little thing
edit 21d80a5 added number to log
pick 76b9da6 added the apply command
pick c264051 Revert "added file_size" - not implemented correctly
RY quand vous vous trouverez avec la ligne de commande, vous pourrez revenir sur ce commit pour en créer deux (ou plus) nouveaux. Disons que 21d80a5 modifie 2 fichiers, fichier1 et fichier2, et que vous voulez le découper en 2 commits séparés. Vous pouvez faire ceci quand la recombinaison vous redonne la main avec la ligne de commande:
$ git reset HEAD^
$ git add fichier1
$ git commit 'première partie du commit découpé'
$ git add fichier2
$ git commit 'seconde partie du commit découpé'
$ git rebase --continue
Et maintenant, au lieu d'avoir 5 commits, vous en avez 6.
La recombinaison interactive peut vous aider sur un dernier point utilise, elle peut oublier des commits. Si au lieu de sélectionner 'pick', 'squash' ou 'edit' pour la ligne de commit, vous effacez simplement la ligne, alors le commit sera retiré de l'historique.