Autre cas classique d’utilisation du rebase interactif : la découpe de commit. Bon, en réalité ce n’est pas le rebase qui va se charger de la découpe. Git va plutôt nous donner la main pour éditer un commit au milieu d’un rebase, et par conséquent on va pouvoir le découper, ou faire tout ce qu’on veut de lui. 

« …le découper ou faire tout ce qu’on veut de lui… », hors contexte cette phrase est plutôt flippante ! Rassure-toi, aucun mauvais traitement n’a été fait aux commits lors de ce cours vidéo.

Dans le schéma d’historique affiché, j’ai un commit fourre-tout « f4-2 + f4-3 » que je veux découper en 2 commits. Je vais donc faire un git rebase -i <le SHA-1 de f4-1> feature-4.

Comme d’hab’ mon éditeur est ouvert automatiquement avec la liste des commits et l’action pick par défaut.

Je vais renseigner l’action qui va me permettre la découpe et faire un edit.

Quand c’est fait, j’enregistre et je ferme le fichier.

Le rebase démarre alors, positionne HEAD sur f4-1 et applique le commit f4-2 + f4-3. Là il s’arrête dans un état temporaire et me donne la main en m’affichant quelques informations dans mon terminal.

Il m’indique que je peux corriger le commit et que quand je serai prêt à continuer le reste du rebase il me suffira de faire un git rebase --continue.

Je peux donc éditer mon commit. Et pour le découper je vais utiliser un savoir-faire indépendant de rebase. Je vais passer rapidement sur certains aspects qui sont expliqués dans notre cours vidéo « Git "undo" ou le savoir-défaire » et qui ne te sont pas nécessaires ici.

Je commence par défaire le commit en ramenant HEAD un cran en arrière, mais en prenant soin de garder les modifications dans ma copie de travail. C’est à ça que me sert le mode --mixed de reset ici.

Une fois que c’est fait, je peux recréer deux commits ou plus à partir des modifs en cours dans ma copie de travail. On va dire que je veux découper des modifs au sein d’un même fichier. Je vais donc faire un git add -p ou --patch pour faire de l’ajout sélectif et je crée mon premier commit f4-2.

Je crée ensuite un commit f4-3 avec les modifs restantes.

Et enfin je dis à rebase que j’ai terminé et qu’il peut reprendre la main avec un git rebase --continue. Lui va terminer son travail en rejouant le dernier commit f4-4. Puis le rebase se terminera en déplaçant l’étiquette de branche, ainsi que HEAD une dernière fois.

Bien utiliser Git merge vs rebase

Produire un historique cohérent et utile nécessite de savoir aussi bien nettoyer notre travail que fusionner des branches. Les commandes rebase et merge se complètent parfaitement quand on sait bien les utiliser…