Nettoyer une branche Git
Lorsque vous travaillez avec Git, il est assez courant d'accumuler de nombreuses branches différentes pour les différentes fonctionnalités sur lesquelles vous travaillez. Cependant, une fois fusionné avec notre branche principale, vous souhaiterez peut-être nettoyer les branches inutilisées afin que votre espace de travail Git soit plus organisé.
Nettoyer une branche Git locales
Tout d'abord, vous voulez vérifier quelles branches ont déjà été fusionnées avec votre branche actuelle. Dans ce cas, on supposera que vous souhaitez supprimer les branches locales fusionnées avec le master. Pour vérifier les branches fusionnées, utilisez la commande «git branch» avec le paramètre -merged :
git checkout master git branch --merged commit |
vous obtiendrez un résultat ressemblant à ceci :
feature * master |
Si vous omettez de fournir le hachage de validation, la commande impliquera que vous faites référence à HEAD (également appelé dernier commit de votre branche actuelle). Maintenant que vous avez déjà fusionné les branches locales avec master, vous devrez les supprimer. Le moyen le plus simple de supprimer les branches Git locales est d'utiliser la commande git branch avec le paramètre -d.
git branch -d branch |
Le paramètre -d signifie -delete et elle peut être utilisée chaque fois que la branche que vous souhaitez nettoyer est complètement fusionnée avec votre branche en amont. Si votre branche est nommée feature par exemple, pour nettoyer cette branche, vous exécuteriez la commande suivante :
git branch -d release |
vous obtiendrez un résultat ressemblant à ceci :
Deleted branch feature (was bd6803e). |
Forcer la suppression des branches Git non fusionnées
L'autre façon de nettoyer les branches locales sur Git est d'utiliser la commande git branch avec le paramètre -D. Dans ce cas, le paramètre -D signifie «-delete -force» et elle est utilisée lorsque vos branches locales ne sont pas encore fusionnées avec vos branches de suivi à distance :
git branch -D branch |
Comme vous le savez probablement déjà, vous avez une branche locale mais vous avez également une branche de suivi étant un ensemble de branches pour représenter l'état de votre branche à distance (également appelée branche en amont). Par conséquent, si vous effectuez un commit sur votre branche locale sans la pousser vers la branche à distance, votre branche de suivi à distance sera derrière votre branche locale, donc non fusionnée. Pour voir les différences entre votre branche locale et votre branche de suivi à distance, exécutez la commande «git diff» :
git diff branch..origin/branch |
S'il y a des différences entre les branches, vous devrez utiliser le paramètre -D pour supprimer la branche localement. Ainsi, en tapant la commande suivante :
git branch -d branch |
vous aurez probablement se genre d'erreur :
error: The branch 'branch' is not fully merged. If you are sure you want to delete it, run 'git branch -D branch'. |
tapez plutôt la commande suivante :
git branch -D branch |
vous obtiendrez un résultat ressemblant à ceci :
Deleted branch feature (was 033518b). |
Maintenant que vos branches locales sont nettoyées, voyons comment vous pouvez supprimer les branches de suivi à distance de votre dépôt Git.
Commande une ligne
Dans certains cas, il peut être utile d'avoir une ligne unique pour supprimer les branches locales inutilisées. Pour ceux étant curieux, voici comment supprimer les branches locales inutilisées en une seule ligne sous une distribution Linux :
git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d |
Avant de l'exécuter, expliquons rapidement cette commande :
- git branch --merged : tout d'abord, vous listez simplement toutes les branches actuellement fusionnées avec votre branche actuellement extraite.
- egrep -v "(^\*|master|dev) : vous utilisez la fonction de correspondance inversée de grep afin d'exclure toutes les branches pouvant être appelées master ou dev, juste au cas où;
- xargs git branch -d : vous supprimez toutes les branches listées précédemment.
Naturellement, vous pouvez modifier la commande egrep afin d'inclure vos propres branches.
Nettoyer les branches de suivi à distance
Pour rappel, une branche de suivi est une branche locale définie pour suivre les modifications effectuées sur la branche à distance de votre serveur Git. Ces branches de suivi sont créées afin de suivre les modifications, mais elles peuvent devenir obsolètes si les branches à distance ont été supprimées sur le serveur. Dans ce cas, supposons que vous ayez une branche feature locale, une branche de suivi à distance nommée origin/feature, mais que la branche feature a été supprimée sur le serveur à distance.
Git Remote Prune
Afin de nettoyer les branches de suivi à distance, c'est-à-dire de supprimer les références aux branches distantes non existantes, utilisez la commande git remote prune et spécifiez le nom à distance selon la syntaxe suivante :
git remote prune a-distance |
Afin de trouver le nom à distance configurées, exécutez la commande git remote avec le paramètre -v.
git remote -v |
vous obtiendrez un résultat ressemblant à ceci :
origin https://gitserver.com/user/repository.git (fetch) origin https://gitserver.com/user/repository.git (fetch) |
Dans cet exemple, le nom à distance est origin. Afin de supprimer les branches de suivi à distance, nous exécuterions alors la commande suivante :
git remote prune origin |
vous obtiendrez un résultat ressemblant à ceci :
Pruning origin URL: https://monserveurgit.com/user/repository.git * [pruned] origin/feature |
Prune en allant chercher
Dans certains flux de travail Git, les branches sont supprimées à distance chaque fois qu'elles sont intégrées à la branche principale. Au lieu d'avoir un prune à distance périodiquement, vous pouvez également récupérer les nouvelles références et appliquer un prune à vos branches en même temps. Afin de nettoyer les branches de suivi à distance lors de la récupération, utilisez la commande git fetch avec le paramètre -prune.
git fetch --prune remote |
Sinon, vous pouvez simplement utiliser le raccourci «-p» au lieu de taper «prune» à chaque fois :
git fetch -p remote |
Dans le cas d'un origin à distance, on aurait la commande suivante :
git fetch --prune origin |
vous obtiendrez un résultat ressemblant à ceci :
From https://monserveurgit.com/user/repository.git - [deleted] (none) -> origin/feature |
Cependant, spécifier le paramètre prune peut être un peu fatigant. Heureusement pour vous, vous pouvez configurer votre espace de travail Git afin d'exécuter l'opération prune à chaque fois que vous effectuez une extraction ou une opération d'extraction. Pour configurer Git pour exécuter prune à chaque extraction, exécutez la commande suivante :
git config --global fetch.prune true |
Définition de votre flux de travail Git-flow
Lorsque vous travaillez avec le suivi à distance et les succursales locales, il est important pour vous et votre équipe de définir un flux de données Git auquel vous pouvez vous tenir. Si vous travaillez avec quelqu'un pour examiner les modifications et les approuver dans votre base de code, il peut également être nécessaire pour le réviseur de supprimer la branche à distance par la suite.
De cette façon, vous serez en mesure d'appliquer un prune vos branches de suivi à distance inutilisées et vos branches locales. La définition de cette étape est importante car cela peut devenir assez compliqué de gérer des dizaines de branches différentes sur votre référentiel Git local. Maintenant que vous avez une idée plus claire sur la façon de supprimer les branches de suivi à distance inutilisées, voyons comment vous pouvez effectuer la même astuce pour les branches à distance.
Nettoyer les branches à distance
Nous allons voir comment nous pouvons supprimer les branches distantes lorsqu'elles ne sont plus utilisées. Avant d'effectuer des opérations de suppression sur votre référentiel Git, assurez-vous que vous êtes à jour avec les commits récents ou les fusions effectuées sur votre référentiel :
git pull |
Maintenant que vous êtes à jour, vous pouvez commencer à supprimer vos anciennes branches à distance. Pour nettoyer les anciennes branches à distance, utilisez la commande git branch avec les paramètres -r et -merged. Comme toujours, vous devez être sur la branche cible pour voir les branches déjà fusionnées avec cette branche :
git checkout master git branch -r --merged commit |
vous obtiendrez un résultat ressemblant à ceci :
origin/feature origin/master |
Si vous ne spécifiez pas le commit, la commande impliquera simplement que vous faites référence à HEAD (également connu sous le nom de dernier commit sur la branche). Maintenant que vous connaissez les branches à distance déjà fusionnées avec master, vous pouvez utiliser la commande «git push» pour supprimer les branches à distance :
git push remote --delete branch |
Dans l'exemple donné précédemment, cette commande donnerait :
git push origin --delete feature |
vous obtiendrez un résultat ressemblant à ceci :
To https://monserveurgit.com/user/repository.git - [deleted] feature |
Commande en ligne
La commande fournie est en fait très similaire à celle utilisée pour supprimer les branches Git locales. Pour supprimer les branches à distance inutilisées, vous pouvez utiliser la ligne suivant sous Linux :
git branch -r --merged | egrep -v "(^\*|master|dev)" | xargs -n 1 git push --delete origin |
Encore une fois, expliquons rapidement les différentes parties de cette commande :
- git branch --merged : dans ce cas, vous listez les branches à distance étant actuellement fusionnées avec votre branche actuellement extraite. En conséquence, assurez-vous que vous êtes sur la bonne branche, rappelez-vous que la commande «git branch --merged» prend le HEAD lorsqu'elle n'est pas fournie avec un commit SHA;
- egrep -v "(^\*|master|dev) : vous utilisez la fonction de correspondance inversée de grep afin d'exclure toutes les branches pouvant être appelées master ou dev, juste au cas où;
- xargs git branch -d : dans ce cas, vous prenez chaque branche listée et vous la supprimez du serveur à distance.