J'ai un référentiel Git avec plusieurs branches.
Comment savoir quelles branches sont déjà fusionnées dans la branche principale?
git branch --merged master
liste les branches fusionnées dans master
git branch --merged
liste les branches fusionnées dansTÊTE(c'est-à-dire le bout de la branche actuelle)
git branch --no-merged
liste les branches qui n'ont pas été fusionnées
Par défaut, cela s'applique uniquement aux branches locales. L’indicateur -a
affiche les branches locales et distantes et l’indicateur -r
n’indique que les branches distantes.
Vous pouvez utiliser la commande git merge-base
pour rechercher la dernière validation commune entre les deux branches. Si ce commit est identique à celui de votre tête de branche, celle-ci a été complètement fusionnée.
Notez que git branch -d
fait déjà ce genre de chose car il refusera de supprimer une branche qui n'a pas déjà été complètement fusionnée.
Il existe également une solution d'interface graphique. Il suffit de taper
gitk --all
Une nouvelle fenêtre d'application affichera une représentation graphique de l'ensemble de votre dépôt, où il est très facile de savoir si une branche a déjà été fusionnée ou non
Sur le thème du nettoyage des branches distantes
git branch -r | xargs -t -n 1 git branch -r --contains
Ceci répertorie chaque branche distante suivie par les branches distantes dans lesquelles se trouvent leurs derniers SHA.
Ceci est utile pour déterminer quelles branches distantes ont été fusionnées mais n'ont pas été supprimées et lesquelles n'ont pas été fusionnées et sont donc en déclin.
Si vous utilisez 'tig' (c'est comme gitk mais basé sur un terminal), alors vous pouvez
tig Origin/feature/someones-decaying-feature
pour voir l'historique de commit d'une branche sans avoir à git checkout
Utilisez git merge-base <commit> <commit>
.
Cette commande trouve les meilleurs ancêtres communs entre deux commits. Et si l'ancêtre commun est identique au dernier commit d'une "branche", alors nous pouvons sans risque supposer qu'une "branche" a déjà été fusionnée dans le maître.
Voici les étapes
git merge-base <commit-hash-step1> <commit-hash-step2>
. Plus d'infos sur git merge-base https://git-scm.com/docs/git-merge-base .
J'utilise la fonction bash suivante comme: git-is-merged develop feature/new-feature
git-is-merged () {
merge_destination_branch=$1
merge_source_branch=$2
merge_base=$(git merge-base $merge_destination_branch $merge_source_branch)
merge_source_current_commit=$(git rev-parse $merge_source_branch)
if [[ $merge_base = $merge_source_current_commit ]]
then
echo $merge_source_branch is merged into $merge_destination_branch
return 0
else
echo $merge_source_branch is not merged into $merge_destination_branch
return 1
fi
}
Voici mes techniques lorsque je dois déterminer si une branche a été fusionnée, même si elle a été rebasée pour être à jour avec notre branche principale, ce qui est un scénario courant pour les branches de fonctions.
Aucune de ces approches n'est infaillible, mais je les ai trouvées utiles plusieurs fois.
À l'aide d'un outil visuel tel que gitk ou TortoiseGit, ou simplement git log avec --all, parcourez l'historique pour voir toutes les fusions dans la branche principale. Vous devriez pouvoir déterminer si cette branche de fonctionnalité particulière a été fusionnée ou non.
Si vous avez l'habitude de toujours supprimer à la fois les branches locale et distante lorsque vous fusionnez dans une branche de fonctionnalités, vous pouvez simplement mettre à jour et supprimer les télécommandes sur votre autre ordinateur et les branches de fonctionnalités disparaîtront.
Pour me souvenir de cela, j'utilise déjà extensions de flux git (édition AVH) } pour créer et fusionner mes branches de fonctionnalités localement. -remove la branche distante.
Exemple de création/finition de branche d'objet
554 Andreas:MyRepo(develop)$ git flow start tmp
Switched to a new branch 'feature/tmp'
Summary of actions:
- A new branch 'feature/tmp' was created, based on 'develop'
- You are now on branch 'feature/tmp'
Now, start committing on your feature. When done, use:
git flow feature finish tmp
555 Andreas:MyRepo(feature/tmp)$ git flow finish
Switched to branch 'develop'
Your branch is up-to-date with 'if/develop'.
Already up-to-date.
[post-flow-feature-finish] Delete remote branch? (Y/n)
Deleting remote branch: Origin/feature/tmp.
Deleted branch feature/tmp (was 02a3356).
Summary of actions:
- The feature branch 'feature/tmp' was merged into 'develop'
- Feature branch 'feature/tmp' has been locally deleted
- You are now on branch 'develop'
556 Andreas:ScDesktop (develop)$
.git/hooks/post-flow-feature-finish
NAME=$1
Origin=$2
BRANCH=$3
# Delete remote branch
# Allows us to read user input below, assigns stdin to keyboard
exec < /dev/tty
while true; do
read -p "[post-flow-feature-finish] Delete remote branch? (Y/n) " yn
if [ "$yn" = "" ]; then
yn='Y'
fi
case $yn in
[Yy] )
echo -e "\e[31mDeleting remote branch: $2/$3.\e[0m" || exit "$?"
git Push $2 :$3;
break;;
[Nn] )
echo -e "\e[32mKeeping remote branch.\e[0m" || exit "$?"
break;;
* ) echo "Please answer y or n for yes or no.";;
esac
done
# Stop reading user input (close STDIN)
exec <&-
exit 0
Si vous ne supprimez pas toujours la branche distante, vous pouvez toujours rechercher des validations similaires pour déterminer si la branche a été fusionnée ou non. Le piège réside dans le fait que la branche distante a été redéfinie sur une valeur non reconnaissable, telle que l'écrasement des validations ou la modification des messages de validation.
Exemple de commandes sur la branche master:
gru
gls Origin/feature/foo
glf "my message"
Dans ma configuration bash .profile
alias gru='git remote update -p'
alias glf=findCommitByMessage
findCommitByMessage() {
git log -i --grep="$1"
}
Afin de vérifier quelles branches sont fusionnées dans le maître, vous devez utiliser ces commandes:
git branch <flag[-r/-a/none]> --merged master
liste de toutes les branches fusionnées dans le maître.git branch <flag[-r/-a/none]> --merged master | wc -l
compte le nombre de toutes les branches fusionnées dans le maître.Les drapeaux sont:
-a
flag - (tout) montrant les branches distantes et locales-r
indicateur - (distant) montrant uniquement les branches distantes<emptyFlag>
- montrant local branches uniquement par exemple: git branch -r --merged master
vous montrera tous les référentiels distants fusionnés dans le maître.
Voici un petit guide qui vous permettra de savoir si votre branche actuelle incorpore ou s'il manque des données d'une branche distante Origin/master:
$ git fetch && git branch -r --merged | grep -q Origin/master && echo Incorporates Origin/master || echo Out of date from Origin/master
Je suis tombé sur cette question lorsque je travaillais sur une branche technique et que je voulais souvent m'assurer que les travaux les plus récents étaient intégrés à ma propre branche de travail distincte.
Pour généraliser ce test, j'ai ajouté l'alias suivant à mon ~/.gitconfig:
[alias]
current = !git branch -r --merged | grep -q $1 && echo Incorporates $1 || echo Out of date from $1 && :
Alors je peux appeler:
$ git current Origin/master
pour vérifier si je suis courant.