Les branches permettent d'avoir un historique non linéaire et permettent de travailler pendant un moment sur une fonctionnalité particulière sans pour autant "polluer" le flux principal. Elles peuvent servir à travailler sur des fonctions spéciales mais aussi être utilisées pour garder une bonne organisation avec des branches qui correspondent à nos différents environnements (master, recipe, dev, bugfix...).
branch
La commande branch
permet de gérer tout ce qui a trait aux branches (ajout, listing, suppression, renommage).
git branch # Permet de lister les branches
git branch <branche> # Permet de créer une nouvelle branche <branche>
git branch -m <branche> # Renomme la branche courante en <branche>
git branch -d <branche> # Permet de supprimer une branche
Attention ! On ne peut pas supprimer une branche qui n'aurait pas été fusionné avec une autre (on perdrait alors les modifications de la branche). Si on souhaite forcer cette suppression, et perdre tout le travail effectué dessus il faudra utiliser un D majuscule.
git branch -D <branche> # Supprime la branche même si elle n'a pas été fusionnée
checkout
Une fois les branches créées, il faut être capable d'aller d'une branche à une autre. Pour cela, on peut compter sur la commande checkout
vu précédemment.
git checkout <branche>
Permet de se rendre sur une branche existante. En revanche, si vous le souhaitez vous pouvez demander à git de sauter sur une branche qui n'existe pas en la créant au préalable.
git checkout -b <branche>
# équivalent à
git branch <branche>
git checkout <branche>
merge
Merge permet de ramener une branche sur une autre et ainsi de la fusionner. La fusion de 2 branche se fait toujours à partir de la branche principale.
- La branche "source" sera affectée en récupérant l'historique de la branche ou un commit de fusion
- La branche fusionnée ne sera pas affectée
git merge <branche>
Fusionne la branche <branche>
avec la branche courante. Git choisira automatiquement l'algorithme de fusion à utiliser.
git merge --no-ff <branche>
Fusionne la branche <branche>
avec la branche courante en générant un commit de fusion (même si un fast-foward est possible).
Fast-Forward ?
Un Fast-forward, est utilisé quand il existe un chemin simple pour relier notre branche et la branche cible. En effet, si il n'y a pas eu de commit entre temps la fusion consiste à ajouter les commit de la branche cible à la suite du dernier commit de la branche courante. Voici un petit schéma issu de atlassian.com pour mieux comprendre de quoi il s'agit.
En revanche un fast-forward n'est pas possible si les 2 branches évoluées en même temps. Git n'a alors pas d'autre choix que d'effectuer un 3-way merge en effectuant un commit pour rattacher les 2 branches.
Fast-forward ou 3-way merge ? Le choix d'une stratégie de fusion va dépendre du cas à traiter.
Dans le cas d'un bufix ou d'une petite feature on préfèrera utiliser un fast-forward afin de garder un historique linéaire.
En revanche pour l'intégration d'une nouvelle fonctionnalité importante avec beaucoup de commit on préfèrera utiliser un 3-way-merge afin d'obtenir un historique plus organisé.