Git
Chapters ▾ 2nd Edition

3.3 Les branches avec Git - Gestion des branches

Gestion des branches

Maintenant que vous avez créé, fusionné et supprimé des branches, regardons de plus près les outils de gestion des branches qui s’avèreront utiles lors d’une utilisation intensive des branches.

La commande git branch permet en fait bien plus que la simple création et suppression de branches. Si vous la lancez sans argument, vous obtenez la liste des branches courantes :

$ git branch
  iss53
* master
  test

Notez le caractère * qui préfixe la branche master : il indique la branche courante (c’est-à-dire la branche sur laquelle le pointeur HEAD se situe). Ceci signifie que si, dans cette situation, vous validez des modifications (grâce à git commit), le pointeur de la branche master sera mis à jour pour inclure vos modifications. Pour visualiser la liste des derniers commits sur chaque branche, vous pouvez utiliser le commande git branch -v :

$ git branch -v
  iss53   93b412c fix javascript issue
* master  7a98805 Merge branch 'iss53'
  test 782fd34 add scott to the author list in the readmes

--merged et --no-merged sont des options très utiles qui permettent de filtrer les branches de cette liste selon que vous les avez ou ne les avez pas encore fusionnées avec la branche courante. Pour voir quelles branches ont déjà été fusionnées dans votre branche courante, lancez git branch --merged :

$ git branch --merged
  iss53
* master

Comme vous avez déjà fusionné iss53 un peu plus tôt, vous la voyez dans votre liste. Les branches de cette liste qui ne comportent pas le préfixe * peuvent généralement être effacées sans risque au moyen de git branch -d puisque vous avez déjà intégré leurs modifications dans une autre branche et ne risquez donc pas de perdre quoi que ce soit.

Pour visualiser les branches qui contiennent des travaux qui n’ont pas encore été fusionnés, vous pouvez utiliser la commande git branch --no-merged  :

$ git branch --no-merged
  test

Ceci affiche votre autre branche. Comme elle contient des modifications qui n’ont pas encore été intégrées, essayer de les supprimer par la commande git branch -d se solde par un échec :

$ git branch -d test
error: The branch 'test' is not fully merged.
If you are sure you want to delete it, run 'git branch -D test'.

Si vous souhaitez réellement supprimer cette branche et perdre ainsi le travail réalisé, vous pouvez tout de même forcer la suppression avec l’option -D, comme l’indique le message.

Astuce

Les options décrites ci-dessus, --merged et --no-merged vont, si on ne leur fournit pas un nom de branche ou de commit comme argument, vous afficher ce qui a été, respectivement, fusionné ou non-fusionné dans votre branche actuelle.

Vous pouvez toujours fournir un argument additionnel pour interroger l’état de fusion par rapport à une autre branche sans extraire cette branche avant, comme lorsqu’on se demande ce qui n’a pas été fusionné dans la branche master.

$ git checkout testing
$ git branch --no-merged master
  topicA
  featureB

Renommer une branche

Avertissement

Ne renommez pas les branches qui sont encore utilisées par d’autres collaborateurs. Ne renommez pas une branche telle que master/main/mainline avant d’avoir lu la section « Renommer la branche master ».

Supposez que vous avez une branche appelée mauvais-nom-de-branche et que vous voulez la changer en nom-de-branche-corrigé, tout en conservant l’historique. Vous voulez aussi changer le nom de la branche sur le serveur distant (GitHub, GitLab, ou tout autre serveur). Comment s’y prendre ?

Renommez la branche localement avec la commande git branch --move :

$ git branch --move mauvais-nom-de-branche nom-de-branche-corrigé

Ceci remplace votre mauvais-nom-de-branche par nom-de-branche-corrigé, mais seulement localement pour l’instant. Pour montrer aux autres la branche corrigée sur le serveur distant, poussez-la :

$ git push --set-upstream origin nom-de-branche-corrigé

Faisons un point rapide :

$ git branch --all
* nom-de-branche-corrigé
  main
  remotes/origin/mauvais-nom-de-branche
  remotes/origin/nom-de-branche-corrigé
  remotes/origin/main

Notez que vous êtes sur la branche nom-de-branche-corrigé. La branche corrigée est disponible sur le serveur distant. Cependant la branche mauvaise est encore aussi présente sur le serveur distant. Vous pouvez supprimer la branche mauvaise du serveur distant :

$ git push origin --delete mauvais-nom-de-branche

À présent, le mauvais nom de branche est complètement remplacé par le nom de branche corrigé.

Changer le nom de la branche master

Attention

Changer le nom d’une branche telle que master/main/mainline/default va casser les outils d’intégration de service et d’aide, ainsi que les scripts de construction/publication que votre dépôt utilise. Avant de le faire, assurez-vous de tout couvrir avec vos collaborateurs. Assurez-vous aussi de rechercher précisément et de mettre à jour toutes les références à la vieille branche dans votre dépôt et dans les scripts.

Renommez votre branche locale master en main avec la commande suivante :

$ git branch --move master main

Il n’y a plus de branche master en local, parce qu’elle a été renommée en branche main.

Pour avertir les autres de cette branch main, vous devez la pousser sur le serveur distant Cela rend la branche renommée disponible sur le serveur distant.

$ git push --set-upstream origin main

Enfin, nous finissons dans l’état suivant :

git branch --all
* main
  remotes/origin/HEAD -> origin/master
  remotes/origin/main
  remotes/origin/master

Votre branche locale master a disparu, car elle a été remplacée par la branche main. La branche main est aussi disponible sur le serveur distant. Mais le serveur distant a toujours la branche master. Les autres collaborateurs vont continuer à utiliser la branche master comme base pour leurs travaux, jusqu’à ce que vous fassiez quelques modifications supplémentaires.

Maintenant, vous avez quelques tâches supplémentaires à faire pour terminer la transition :

  • Tous les autres projets dépendant de celui-ci doivent être avoir leur configuration et leur code modifiés en conséquence.

  • Mettez à jours tous vos fichiers de configuration de test.

  • Ajustez les scripts de construction et de publication.

  • Redirigez les réglages sur votre hôte de dépôt concernant les choses telles que la branche par défaut du dépôt, le règles de fusion et toute autre configuration qui a trait aux noms de branche.

  • Mettez à jour les références à l’ancienne branche dans la documentation.

  • Fermez ou fusionnez toutes les demandes de tirage destinées à l’ancienne branche.

Après toutes ces tâches, et s’être assuré que la branche main se comporte comme la branche master, vous pouvez supprimer la branche master :

$ git push origin --delete master
scroll-to-top