Trouver des succursales Git non fusionnées?

276

J'ai un référentiel Git avec de nombreuses branches, certaines déjà fusionnées et d'autres non. Le nombre de succursales étant assez important, comment puis-je déterminer les succursales qui n'ont pas encore été fusionnées? Je voudrais éviter d'avoir à faire une fusion "octopus" et à fusionner des branches qui ont déjà été fusionnées.

fluca1978
la source
1
D'abord, je riais du terme de la "fusion des poulpes". Mais au cas où vous ne le sauriez pas, comme moi: c'est le nom officiel d'une stratégie de fusion :-) Voir git-scm.com/docs/git-merge ou atlassian.com/de/git/tutorials/using-branches/ fusion-stratégie
observateur

Réponses:

463

Essaye ça:

git branch --merged master

Il fait ce qu'il dit sur l'étain (liste les branches qui ont été fusionnées master). Vous pouvez également tirer l'inverse avec:

git branch --no-merged master

Si vous ne spécifiez pas master, par exemple ..

git branch --merged

alors il vous montrera les branches qui ont été fusionnées dans le courant HEAD(donc si vous êtes sur master, c'est équivalent à la première commande; si vous êtes sur foo, c'est équivalent à git branch --merged foo).

Vous pouvez également comparer les branches en amont en spécifiant l' -rindicateur et une référence à comparer , qui peuvent être locales ou distantes:

git branch -r --no-merged origin/master
ambre
la source
5
Si vous fusionnez foodans master, il apparaîtra dans la git branch --merged masterliste. Mais que se passe-t-il si vous vous engagez à nouveau foo? N'apparaît-il plus dans cette liste, ou bien, comme s'il comportait de nouveaux commits, il a été fusionné à un moment donnémaster ?
Craig Otis
11
@CraigOtis Il n'apparaîtra plus dans la liste. --mergedrépertorie uniquement les branches qui sont complètement fusionnées dans la branche donnée.
Amber
et gitk --remotes --not origin/mastervous montrera les commits sur chaque branche qui n'ont pas été fusionnés avec master.
yoyo
5
Imaginez ceci ... une réponse git facile à comprendre et à utiliser!
jleach
1
Existe-t-il un moyen d'obtenir la liste sans consulter la succursale? Comme pointer vers le serveur, puis obtenir la liste?
xbmono
57

Vous pouvez également utiliser le -rparamètre pour afficher les branches distantes qui n'ont pas été fusionnées dans le maître:

git branch -r --merged master

git branch -r --no-merged

                         
NemoXP
la source
19
ou -apour voir à la fois éloigné et local en même temps
Simon Forsberg
1
Cette dernière doit-elle être git branch -r --no-merged master?
MortimerCat
28

Si une branche est déjà fusionnée, la fusionner à nouveau ne fera rien. Vous n'avez donc pas à vous soucier de la "fusion" de branches déjà fusionnées.

Pour répondre à votre question, vous pouvez simplement émettre

 git branch --merged

pour voir les branches fusionnées ou

 git branch --no-merged

pour voir les branches non fusionnées. Votre branche actuelle est implicite mais vous pouvez spécifier d'autres branches si vous le souhaitez.

 git branch --no-merged integration

vous montrera les branches qui ne sont pas encore fusionnées en integrationbranche.

Adam Dymitruk
la source
1

Le script ci-dessous trouvera toutes les origin/*branches qui sont en avance sur la branche actuelle

#!/bin/bash

CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)

echo -e "Current branch: \e[94m$CURRENT_BRANCH\e[0m"
echo ''

git branch -a | grep remotes/origin/ | while read LINE
do
    CMD="git diff --shortstat remotes/origin/${CURRENT_BRANCH}...${LINE}"

    if $CMD | grep ' file' > /dev/null; then
        echo -e "\e[93m$LINE\e[0m" | sed 's/remotes\/origin\///'
        $CMD
        echo ''
    fi
done

La version à jour du script

moldcraft
la source
0
Below script will fetch you unmerged branches and write results in .xls file 
#!/usr/bin/env bash
echo "getting list of unmerged_branches from the remote"
file_name=unmerged_branches.xls`enter code here`
current_time=$(date "+%Y.%m.%d-%H.%M.%S")
for branch in `git branch -r --no-merged | grep -v HEAD`;
do echo -e `git show --format="%cd  \\t%cr  \\t%ae" $branch | head -n 1` \\t$branch; 
done | sort -r >> $current_time.$file_name
echo "result is writtein in ";
echo $current_time.$file_name;
user3915489
la source