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 d'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 la dernière fusion 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 cinq 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. 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 fusionner les messages des deux 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 une pause sera marquée 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

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 deux fichiers, fichier1 et fichier2 et que vous voulez le découper en deux 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 cinq commits, vous en avez six.

La recombinaison interactive peut vous aider sur un dernier point, 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.