Git rebase d’une branche sur une autre avec VSCode

Logo Git

Je vais vous expliquer ce qu’est un rebase dans GIT, et comment effectuer un rebase dans VSCode.

Lorsque plusieurs personnes collaborent sur un projet, il arrive souvent qu’une pull-request ne peut être mergé du à des conflits car plusieurs personnes ont modifié les mêmes fichiers.
Pour résoudre ces conflits nous allons faire un rebase de la branche de l’utilisateur sur la master.

Qu’est ce qu’un rebase ?

Le rebase va permettre de déplacer le point de départ de la branche de l’utilisateur vers le dernier commit de la master. On peut considérer un rebase comme une mise à jour de la branche de l’utilisateur en important / fusionnant les commits de la master sur la branche de l’utilisateur.
Votre branche sera donc à jour par rapport à la master.

L’exemple suivant permet de bien visualiser le changement qu’apporte un rebase.
Sur l’arbre GIT de gauche, notre branche JIRA-30, en jaune, démarre du cercle rouge.
Depuis son départ, il y a deux nouveaux commits (flèches rouges) sur la branche master qui correspondent à des merges de pull-request.
Notre branche JIRA-30 n’est donc plus à jour.
Grace au rebase nous allons déplacer le cercle rouge vers la dernière flèche rouge pour obtenir le résultat de la deuxième capture. On constate que les commit1 à 5 se retrouve bien après le dernier commit sur la branche master (cercle rouge).
Sur la troisième image un squash des commits a été effectué avant pour faciliter le rebase et pour des questions de clarté.

Avant - après un rebase sous VSCode

Lancer le rebase

Avant de commencer je vous conseille de squasher vos commits avec VSCode, car comme vous l’avez vu dans la capture précédente le lisibité est meilleure et le rebase sera plus simple.

Depuis VSCode, assurez vous de travailler sur votre branche, JIRA-30 dans cet exemple.

Branche git courante sous VSCode

  • Ouvrez la vue Source control
  • Cliquer sur les en haut de la vue
  • Branch
  • Rebase branch
Lancer un rebase depuis VSCode

Dans la nouvelle vue qui s’ouvre sélectionner origin/master

Choix de la branche pour rebase onto

Résoudre les conflits

Si vous n’avez pas fait au préalable de squash de vos commits, vous aurez très certainement beaucoup de conflits à résoudre. Avec un squash il n’y aura qu’un seul conflit à résoudre.
Vous pouvez avoir autant de conflits que des commits sur votre branche. C’est pour cette raison que je préfère au préalable effectuer un squash des commits de ma branche.
La capture suivante indique que j’ai un conflit à résoudre sur le fichier index.ts

Merge conflits durant un rebase sous VSCode

Je clique sur index.ts et résous mes conflits (généralement il faut faire un Both change et corriger le code). Une fois le conflit résolu je clique sur le signe + pour ajouter le ficher à GIT (git add).

Stage du fichier sous VSCode

Ensuite j’ouvre le terminal VSCode et je tape:

git rebase --continue

Je continue ainsi de suite à résoudre l’ensemble des conflits jusqu’à ne plus avoir marqué rebasing dans la toolbar bleu de VSCode et que VSCode me propose de synchroniser mes changements.
Il ne faut en aucun cas cliquer sur le bouton bleu Sync Changes

Fin du rebase sous VSCode

Pusher les changements

Une fois les conflits résolus, nous allons pusher les changements. Etant donné que nous allons réécrire l’historique GIT il faut faire un push (Force)

Activer l’option push (Force)

Si ce n’est pas déjà fait activer l’option git push (Force) dans les settings de VSCode.

Activer push (Force) sous VSCode

Pour pusher les changement, accéder au menu des actions Git, ensuite Pull, Push et cliquer sur Push (Force)

Lancer le push Force sous VSCode

Résultat du push

Si vous affichez de nouveau la vue git graph, le point de départ de notre branche a changé. Il correspond au dernier commit sur la branche master.

Graph des branches git après un rebase sous VSCode
Graph des branches git après un rebase
Graph des branches git après un squash et rebase sous VSCode
Graph des branches git après un squash et rebase sous VSCode

Commenter

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *