Installation
Travailler avec git
Logiciels
Source Tree
19 min
Ungit
09 min
Github Mac
08 min
GitKraken
13 min

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 pour travailler sur des fonctions spéciales mais aussi être utilisée 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 attrait 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.

crédits atlassian.com

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.

crédits atlassian.com

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é.