Qu’est ce qu’une branche ?
Créer une branche, c’est en quelque sorte comme créer une “copie” de votre projet pour développer et tester de nouvelles fonctionnalités sans impacter le projet de base.
Dans la plupart des système de contrôle de version, justement, une copie physique de la totalité du répertoire de travail est effectuée, ce qui rend la création de branches contraignante et en fait une opération lourde.
Git a une approche totalement différente des branches qui rend la création de nouvelles branches et la fusion de branche très facile à réaliser. Une branche, dans Git, est simplement un pointeur vers un commit (une branche n’est qu’un simple fichier contenant les 40 caractères de l’empreinte SHA-1 du commit sur lequel elle pointe).
Pour rappel, lorsqu’on effectue un commit, Git stocke en fait un objet commit
qui contient les nom et prénom de l’auteur du commit, le message renseigné lors de la création du commit ainsi qu’un pointeur vers l’instantané du contenu indexé et des pointeurs vers le ou les commits précédant directement le commit courant.
Un pointeur est un objet qui contient l’adresse d’une donnée stockée quelque part. On peut utiliser le pointeur pour accéder à la donné en question.
La branche par défaut dans Git s’appelle master
. Cette branche master
va se déplacer automatiquement à chaque nouveau commit pour pointer sur le dernier commit effectué tant qu’on reste sur cette branche.
Notez que la branche master
n’est pas une branche spéciale pour Git : elle est traitée de la même façon que les autres branches. L’idée est que lorsqu’on tape une commande git init
, une branche est automatiquement créée et que le nom donné à cette branche par Git par défaut est “master”. On pourrait très bien la renommer ensuite mais ça ne présente généralement aucun intérêt.
En résumé, une branche est un pointeur vers un commit en particulier. Un commit est un objet qui contient un pointeur vers l’instantané du contenu indexé ainsi que des pointeurs vers le ou les commits le précédant directement.
Ainsi, créer une nouvelle branche dans Git crée simplement un nouveau pointeur plutôt que de recopier l’intégralité du répertoire de travail.
Créer une nouvelle branche
Pour créer une nouvelle branche, on utilise la commande git branch nom-de-la-branche
. Cette syntaxe va créer un nouveau pointeur vers le dernier commit effectué (le commit courant). A ce stade, vous allez donc avoir deux branches (deux pointeurs) vers le dernier commit : la branche master et la branche tout juste créée.
Pour déterminer quel pointeur vous utilisez, c’est-à-dire sur quelle branche vous vous trouvez, Git utilise un autre pointeur spécial appelé HEAD
. HEAD
pointe sur la branche master par défaut. Notez que la commande git branch
permet de créer une nouvelle branche mais ne déplace pas HEAD
.
Nous allons donc devoir déplacer explicitement HEAD
pour indiquer à Git qu’on souhaite basculer sur une autre branche. On utilise pour cela la commande git checkout
suivi du nom de la branche sur laquelle on souhaite basculer.
Note : On peut également utiliser git checkout -b
pour créer une branche et basculer immédiatement dessus. Cela est l’équivalent d’utiliser git branch
puis git checkout
.
HEAD
pointe maintenant vers notre branche test
. Si on effectue un nouveau commit, la branche test
va avancer automatiquement tandis que master
va toujours pointer sur le commit précédent. C’est en effet la branche sur laquelle on se situe lors d’un commit qui va pointer sur ce commit.
Basculer entre les branches
On peut revenir sur notre branche master
en tapant à nouveau une commande git checkout master
. Cela replace le pointeur HEAD
sur la branche master
et restaure le répertoire de travail dans l’état de l’instantané pointé par le commit sur lequel pointe master
.
Si on modifie alors le répertoire de travail et qu’on effectue un nouveau commit, les deux branches master
et test
vont diverger. On va donc avoir deux branches pointant vers des instantanés qui ont enregistré le projet dans deux états différents.