CaenHackYouAcademy
Git

Les branches

Un pointeur de 41 octets, et HEAD qui dit où l'on se trouve.

Voici toute la branche main :

$ cat .git/refs/heads/main
7f3k9q2e8a4c1b6d5f0a9382c7e1b4d6a8f3c209

Quarante caractères et un retour à la ligne. Une branche est un pointeur mobile vers un commit — pas une copie du code, pas un dossier, pas une zone de stockage. Créer une branche écrit un fichier de 41 octets : c'est pour cela que l'opération est instantanée, et qu'il ne faut pas hésiter à en créer.

HEAD dit où tu es

$ cat .git/HEAD
ref: refs/heads/main

HEAD ne désigne pas un commit mais une branche : celle sur laquelle tu te trouves. C'est ce qui permet à Git de savoir quel pointeur faire avancer quand tu commites.

L'enchaînement complet tient en une phrase : tu commites, HEAD dit quelle branche est courante, cette branche avance vers le nouveau commit, dont le parent est l'ancien.

Basculer

git switch autre-branche          # bascule
git switch -c nouvelle            # crée et bascule
git branch -d fusionnee           # supprime, si fusionnée
git branch -D abandonnee          # supprime dans tous les cas

git switch et git restore ont été introduits pour séparer deux usages que git checkout mélangeait : changer de branche, et restaurer des fichiers. Le checkout fonctionne toujours, mais les commandes récentes disent ce qu'elles font — préfère-les.

Basculer modifie le répertoire de travail pour refléter l'instantané visé. Git refuse si des modifications non commitées risquent d'être écrasées : c'est une protection, pas une contrariété.

La tête détachée n'est pas une erreur

git switch --detach <commit> place HEAD directement sur un commit, sans branche. Git prévient parce que les commits créés là ne seront désignés par rien et deviendront injoignables. C'est parfaitement légitime pour inspecter un état ancien — il suffit de créer une branche avant de commiter si tu veux garder ce que tu fais.

Le piège classique

Supprimer une branche ne supprime pas ses commits. Si elle a été fusionnée, ses commits sont joignables par la branche cible et rien ne change. Si elle ne l'a pas été, git branch -d refuse — c'est le garde-fou. Avec -D, les commits deviennent injoignables, mais restent retrouvables plusieurs semaines par git reflog : voir Réparer.

Autre confusion : une branche n'a pas de propriétaire ni de contenu propre. Parler de « ma branche » désigne un pointeur, dans ton dépôt. Sa contrepartie sur le serveur est un autre pointeur, qui peut désigner un autre commit — d'où le chapitre sur les dépôts distants.

VérificationQuestion 1 / 3

Réponse unique

Que désigne `HEAD` dans un dépôt Git, en fonctionnement normal ?

Indice · Regarde le contenu de .git/HEAD.

On this page