Git switch: le guide complet du débutant

gitswitch

Techno

git

Auteur

Olivier

Mis à jour le

04/11/2020

Une commande nouvelle génération 🕶

Depuis la version 2.23, une nouvelle commande a fait son apparition: git switch. Cette commande était très attendue et vient compléter l’arsenal déjà bien fourni à notre disposition.

git switch est entièrement dédiée au déplacement dans l’historique de commits et à la création de branches locales. Même si ces fonctionnalités étaient déjà accessibles via les commandes git branch et git checkout, cela vient grandement simplifier notre utilisation de git.

Pour les rédiger j'ai bien sûr utilisé ces capsules de connaissances git uniquement accessibles sur ledevwebmoderne.fr que je ne saurai trop te conseiller:

Offre git turbo boost

Petit rappel sur les branches 🌴

Le fonctionnement même de git repose sur les branches. Il n’y a aucune limitation, et leur utilisation est fortement recommandée. Et sache que pour info tu peux en créer autant que tu le veux.

Dans la pratique, une branche correspond à une ligne de développement, permettant ainsi de bien séparer les évolutions, des tests, des mises en production. Chaque équipe / entreprise a son mode de fonctionnement et son propre workflow. Pour les exemples qui vont suivre, on va rester sur un schéma simple avec une branche master et une branche develop.

git switch - situation de départ

Bon à savoir 🎁

Ce qu’il y a de bien avec les branches c’est qu’elles se mettent à jour automatiquement. En effet, lorsque HEAD (là où tu regardes) pointe sur une branche, à chaque nouveau commit sur cette branche, l’étiquette de branche est mise à jour pour pointer sur le dernier commit. Et comme HEAD pointe sur la branche qui elle même pointe sur le dernier commit, HEAD pointe au final sur le dernier commit. Elle n’est pas belle la vie ! 🍾

Maintenant que t’es au point sur les branches, reste à savoir comment se déplacer de branche en branche. Et comme par hasard, c’est là qu’intervient git switch.

Se déplacer où l’on veut 🗺

Se déplacer de branche en branche 🌴 🐒 🌴

git switch est la nouvelle commande qui va te permettre de sauter de branche en branche comme un petit singe 🐒, et son fonctionnement est on ne peut plus basique:

Pour aller sur la branche develop:

⚡️ git switch develop

git switch - démo pour se déplacer sur la branche develop

Pour revenir sur la branche master:

⚡️ git switch master

Que se passe-t-il en tâche de fond ? 🔬

Lorsque tu changes de branche, c’est pour voir ton projet tel qu’il est sur la branche de destination. Ainsi quand tu vas sur master c’est pour voir ton projet tel qu’il est stocké dans le commit C5, et lorsque tu vas sur la branche develop c’est pour voir ton projet tel qu’il est stocké dans le commit C4.

Changer de branche avec git switch revient donc à

  • extraire le projet tel qu’il est à la pointe de la branche (en C4)
  • puis à l’appliquer dans ta copie de travail

git switch - se déplacer sur une branche

Mais git ne s’arrête pas à l’extraction car il faut également repositionner HEAD (là où tu regardes) pour qu’il pointe sur la branche de destination.

Pour résumer, la commande suivante a pour effet

  • d’extraire dans ta copie de travail le projet tel qu’il est stocké dans le commit C4 (pointé par l’étiquette de branche develop),
  • puis de mettre à jour la référence de HEAD pour qu’elle pointe sur la branche develop:
⚡️ git switch develop

Se déplacer directement sur un commit 🎯

Si le déplacement de branche en branche correspond à la majorité de nos déplacements, il est parfois utile de se repositionner à un endroit exact de l’historique en indiquant directement un numéro de commit ou d'étiquette. Intuitivement, on est tenté de lancer la commande suivante pour aller sur l’avant dernier commit de master:

⚡️ git switch master^

Et malheureusement ou plutôt heureusement cette commande échoue:

⚡️ git switch master^
fatal: a branch is expected, got commit 'master^'

Git indique bien dans son message que par défaut il s’attend à aller sur une autre branche. Donc pour aller directement sur un commit, il faudra lui forcer la main en passant l’option --detach

⚡️ git switch master^ --detach
HEAD is now at 76eaf33 C2

Cette commande agit comme une sécurité et porte très bien son nom. En effet, dès lors que l’on pointe directement sur un commit et non sur une branche, HEAD passe en mode détaché.

git switch - démo se déplacer sur un commit en mode détaché

Qu'est-ce que le mode détaché 👻 et comment s’en sortir?

Lorsque tu es en mode détaché, à chaque nouveau commit, HEAD est mis à jour pour pointer vers ce nouveau commit.

Le problème c’est que ces nouveaux commits ne sont accessibles que via leur référence SHA-1. Donc si tu bascules sur une autre branche, tu ne pourras revenir à ces commits qu’en passant leur référence SHA-1…

De plus, comme ces commits ne sont pas directement accessibles depuis une branche, il ne seront pas non plus remontés par git log. Autant dire qu’ils te sembleront comme perdus 😭 (même si en fait ils sont toujours là, bien stockés dans git, mais on ne sait plus comment les retrouver).

Pour te sortir de cette situation, l’astuce est toute simple: créer une branche juste avant de quitter le mode détaché. De cette manière, tu pourras facilement revenir au dernier commit créé, et en plus il apparaitra dans ton historique de commit via git log.

Créer des branches locales 🌴🌴🌴🌴🌴🌴

A partir du commit courant

Pour se déplacer de branche en branche, encore faut-il savoir créer des branches. Pour cela, et c’est sans surprise, la commande git branch fait très bien le job. Ainsi la commande suivante crée la branche develop à partir du commit courant (pointé par HEAD):

⚡️ git branch develop

Cependant avec git branch on crée une branche mais on ne se déplace pas dessus. Hors la plupart du temps on crée une branche parce qu’on en a besoin tout de suite et qu’on souhaite y pousser un nouveau commit. C’est là qu’intervient l’option -c (ou --create) de git switch:

⚡️ git switch -c maNouvelleBranche
Switched to a new branch 'maNouvelleBranche'

git switch - créer une nouvelle branche depuis le commit courant

git switch - démo créer une nouvelle branche depuis le commit courant

Ainsi en une seule commande:

  • git a crée une nouvelle branche “maNouvelleBranche”
  • qui pointe sur le commit courant C3
  • et a dans la foulée “switché” le projet sur cette nouvelle branche en positionnant HEAD dessus

A partir d’un autre commit

Il est également possible de créer cette branche à partir d’un autre commit en passant en paramètre la référence de ce commit. Ainsi dans cet exemple, on crée la nouvelle branche “maNouvelleBranche” à partir du commit référencé par l’étiquette v1.12, puis on se positionne dessus:

⚡️ git switch -c maNouvelleBranche v1.12
Switched to a new branch ‘maNouvelleBranch’

Au bilan, faut-il l’utiliser?

Même si la commande git switch est encore expérimentale, l’utiliser est sécurisant car on ne peut pas basculer en mode HEAD détaché sans le vouloir explicitement. Cela nous rappelle implicitement à créer un maximum de branches, ce qui fait partie des bonnes pratiques de git.

Enfin, le nom de la commande et de ses options sont vraiment explicites et correspondent à ce que veut faire l’utilisateur: se déplacer (switch) sur une branche et créer une branche (—create), et non à l’opération technique qui se passe en tâche de fond, à savoir une extraction (checkout) du projet.

Ma recommandation est bien évidemment d'utiliser git switch dès maintenant afin de prendre le train en marche et de se simplifier la vie, même si à ce jour elle est encore expérimentale.

Passe à la vitesse supérieure avec les capsules de connaissance git

Si cet article t'a plu, que tu souhaites aller plus loin dans ta compréhension de git et maîtriser la bête une bonne fois pour toutes, fais-toi plaisir avec ces capsules de connaissances git uniquement accessibles sur ledevwebmoderne.fr:

Offre git turbo boost