La commande rebase a des options impressionnantes disponibles dans son --interactive
(ou -i
) mode, et l'une des plus largement utilisées est la possibilité d'écraser les commits. Cela permet de prendre des commits plus petits et de les combiner en plus grands, ce qui pourrait être utile si vous terminez la journée de travail ou si vous souhaitez simplement regrouper vos modifications différemment. Nous allons voir comment vous pouvez le faire facilement.
Un mot d'avertissement: ne faites cela que sur les commits qui n'ont pas été poussés dans un référentiel externe. Si d'autres ont basé le travail sur les commits que vous allez supprimer, de nombreux conflits peuvent survenir. Ne réécrivez pas votre historique s'il a été partagé avec d'autres.
Disons que vous venez de faire quelques petits commits et que vous voulez en faire un plus grand. L'historique de notre référentiel ressemble actuellement à ceci:
Les 4 derniers commits seraient beaucoup plus heureux s'ils étaient regroupés, alors faisons simplement cela grâce au rebasage interactif:
$ git rebase -i HEAD~4
pick 01d1124 Adding license
pick 6340aaa Moving license into its own file
pick ebfd367 Jekyll has become self-aware.
pick 30e0ccb Changed the tagline in the binary, too.
# Rebase 60709da..30e0ccb onto 60709da
#
# 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.
#
Donc, quelques choses se sont produites ici. Tout d'abord, j'ai dit à Git que je voulais rebase en utilisant les quatre derniers commits d'où HEAD est avec HEAD ~ 4. Git m'a maintenant mis dans un éditeur avec le texte ci-dessus, et une petite explication de ce qui peut être fait. Vous avez beaucoup d'options à votre disposition à partir de cet écran, mais pour le moment, nous allons simplement tout écraser en un seul commit. Donc, changer les quatre premières lignes du fichier en ceci fera l'affaire:
pick 01d1124 Adding license
squash 6340aaa Moving license into its own file
squash ebfd367 Jekyll has become self-aware.
squash 30e0ccb Changed the tagline in the binary, too.
Fondamentalement, cela indique à Git de combiner les quatre commits dans le premier commit de la liste. Une fois que cela est fait et enregistré, un autre éditeur apparaît avec ce qui suit:
# This is a combination of 4 commits.
# The first commit's message is:
Adding license
# This is the 2nd commit message:
Moving license into its own file
# This is the 3rd commit message:
Jekyll has become self-aware.
# This is the 4th commit message:
Changed the tagline in the binary, too.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Explicit paths specified without -i nor -o; assuming --only paths...
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: LICENSE
# modified: README.textile
# modified: Rakefile
# modified: bin/jekyll
#
Puisque nous combinons autant de commits, Git vous permet de modifier le message du nouveau commit en fonction du reste des commits impliqués dans le processus. Modifiez le message comme bon vous semble, puis enregistrez et quittez. Une fois que cela est fait, vos commits ont été écrasés avec succès!
Created commit 0fc4eea: Creating license file, and making jekyll self-aware.
4 files changed, 27 insertions(+), 30 deletions(-)
create mode 100644 LICENSE
Successfully rebased and updated refs/heads/master.
Et si nous regardons à nouveau l'histoire…
Donc, cela a été relativement indolore jusqu'à présent. Si vous rencontrez des conflits pendant le rebase, ils sont généralement assez faciles à résoudre et Git vous guide le plus possible. L'essentiel est de résoudre le conflit en question, git add
le fichier, puis de git rebase --continue
reprendre le processus. Bien sûr, faire un git rebase --abort
vous ramènera à votre état antérieur si vous le souhaitez. Si pour une raison quelconque vous avez perdu un commit dans le rebase, vous pouvez utiliser le reflog pour le récupérer.
Les détails peuvent être trouvés sur ce lien .