Installation
Travailler avec git
Logiciels
Source Tree
19 min
Ungit
09 min
Github Mac
08 min
GitKraken
13 min

Manipuler l'historique peut parfois s'avérer utile pour corriger un commit mal effectué mais aussi pour préparer une branche avant la fusion.

amend

L'argument --amend permet de rajouter les fichier en staging dans le commit précédent. Ceci permet de corriger un oubli et d'éviter de faire 10 commits pour la même chose.

git commit --amend

Il est important de ne jamais amend un commit déjà publié au risque de rendre compromettre l'historique de tout le monde. A n'utiliser que pour des petits oublis en local.

rebase

Comme son nom l'indique rebase permet de déplacer une branche et de changer son commit de départ (sa base). Un petit schéma pour mieux comprendre :

crédits atlassian.com

Dans le principe c'est très simple, on déplace nos 2 commits. En revanche git va réécrire l'historique, supprimer nos anciens commits et recréer 2 nouveau commits à partir de la nouvelle base (comprendre par là que les commits changent d'ID)

git rebase <nouvelle-base>

Permet de changer la base de la branche courante pour la<nouvelle-base>.

Pourquoi Rebase ?

On peut se demander à quoi peut servir une telle opération. Le rebase va nous être utile pour forcer un fast-forward lors d'une fusion de branche. Reprenons le cas d'une branche que l'on souhaite fusionner :

crédits atlassian.com

Le problème ici, c'est qu'un merge entrainera un 3-way merge qui va générer un nouveau commit de fusion et qui rendra l'historique plus complexe à lire. Le rebase va alors nous permettre de se placer dans un cas propice à un fast-forward.

git checkout feature # On va sur la branche feature
git rebase master  # Notre branche commencera au bout de master
git checkout master # On retourne sur master
git merge feature # On fusionne feature et master

Et pour ceux qui préfèrent les images.

crédits atlassian.com

On voit ici qu'un rebase nous permet de garder un historique simple et linéraire qui sera plus simple à comprendre.

rebase -i

Le drapeau -i permet de déclencher un rebase interactif. Ce mode nous permet de guider git dans son rebase et de lui dire comment organiser les nouveaux commits.

git rebase -i <nouvelle-base>

Cette commande va ouvrir un éditeur nous permettant de dire à git comment réorganiser les différents commit à partir de la nouvelle base

  • pick, permet de d'inclure le commit. On peut en profiter pour changer l'ordre des différents commit
  • reword, permet d'inclure le commit tout en ayant la possibiliter de changer le message
  • edit, permet d'éditer le commit. En séparant en plusieurs commits par exemple
  • squash, combine le commit avec le commit du dessus et permet de changer le message du commit
  • fixup, comme squash mais utilisera le message du commit situé au dessus
  • exec, permet de lancer des commandes shell sur le commit

Bien que très très très très très très très fooooortement déconseillé on peut utiliser le rebase interactif pour modifier l'historique de la branche en cours

git rebase -i HEAD~6

Permet par exemple de modifier les 6 derniers commits.