Git : les branches

Anne git

Les branches, c’est ce qui permet de travailler sur plusieurs versions à la fois.

Créer une branche

Pour voir les banches :

$ git branch

La branche principale s’appelle master. Une étoile indique la branche sur laquelle on est.

Pour créer une branche :

$ git branch une_branche

Se déplacer sur la branche :

$ git checkout une_branche

De même :

$ git checkout master

On peut aussi créer la branche et s’y mettre en une seule commande :

$ git checkout -b une_autre_branche

Pour envoyer la branche sur le dépôt central :

$ git push origin une_branche

Récupérer une branche

Si on souhaite récupérer une copie locale d’une branche du dépôt pour travailler dessus :

$ git checkout -b branche origin/branche

On peut avoir besoin de se synchroniser pour que la branche soit connue localement avant de lancer le commande précédente en faisant :

$ git fetch origin

Il faut noter que le nom local n’a pas besoin d'être le même que le nom distant, mais c’est juste plus pratique.

Après cette commande, les branches locales et distantes seront associées, c’est-à-dire que les commandes telles que push et pull se feront automatiquement dans la bonne branche sans avoir besoin de la préciser.

Fusionner des branches

Pour fusionner des branches, on se place par exemple sur master et on fusionne l’autre branche :

$ git checkout master
$ git merge une_branche

Bien sur, quand on travaille sur une branche, on peut aussi faire le contraire pour récupérer ce qui est modifié dans master :

$ git checkout une_branche
$ git merge master

Et ça marche avec n’importe quelles branches, vu que master n’est la branche principale que par convention, et qu’elle n’a rien de particulier…

Résoudre un conflit

Quand on fait le merge, et qu’il n’arrive pas à résoudre une différence, il signale le(s) fichier(s) où il y a des problème. Il faut alors l'éditer et résoudre le conflit manuellement. Il faut ensuite lui signaler avec :

$ git commit

Il faut noter que dans ce cas, il y a un message de merge par défaut. On peut ajouter des informations au message par défaut si la fusion est délicate. Il est néanmoins intéressant de garder la base du message par défaut qui est facilement reconnaissable.

Déplacer un bout de branche

Situation de départ :

o--o--o--o--o  A
       \
        o--o--o--o--o  B
                     \
                      o--o--o  C

On veut déplacer la branche C sur A (elle ne dépend pas de B). Il faut faire :

$ git rebase --onto A B C

Et on obtient :

o--o--o--o--o  A
      |      \
      |       o'--o'--o'  C
       \
        o--o--o--o--o  B

Attention : quand on utilise rebase, il faut utiliser l’option -f de push car on a modifié les numéros de commit. Ne pas faire ça sur un dépôt public utilisé par d’autres (éventuellement ok dans une pull request).

Effacer une branche

Pour effacer une branche en local :

$ git branche -d branche

ou :

$ git branche -D branche

pour forcer l’effacement si la branche n’a pas été fusionnée.

Pour effacer une branche sur un dépôt :

$ git push origin :branche

A partir de git 1.7, il semble qu’il y ait une syntaxe un peu plus claire pour faire la même chose :

$ git push origin --delete branche

Renommer une branche

Pour renommer une branche en local :

$ git branch -m branche meilleur-nom

ou :

$ git branch -M branche meilleur-nom

pour forcer le renommage si la branche n’a pas été fusionnée.

Si on souhaite aussi renommer la branche sur un dépôt, le plus simple est de la renommer en local, effacer la branche sur le dépôt, et pousser la branche :

$ git branch -m branche meilleur-nom
$ git push origin --delete branche
$ git push --set-upstream origin meilleur-nom

Voir aussi :