Znajdź nie połączone oddziały Git?

276

Mam repozytorium Git z wieloma gałęziami, niektóre już scalone, a niektóre nie. Ponieważ liczba oddziałów jest dość duża, jak mogę ustalić, które oddziały nie zostały jeszcze połączone? Chciałbym uniknąć konieczności łączenia „ośmiornicy” i ponownego łączenia oddziałów, które już zostały połączone.

fluca1978
źródło
1
Najpierw śmiałem się z terminu „połączenie ośmiornicy”. Ale na wypadek, gdybyś nie wiedział, jak ja: To oficjalna nazwa strategii scalania :-) Zobacz git-scm.com/docs/git-merge lub atlassian.com/de/git/tutorials/using-branches/ merge-strategia
obserwator

Odpowiedzi:

462

Spróbuj tego:

git branch --merged master

Robi to, co mówi na puszce (wyświetla listę gałęzi, które zostały połączone master). Możesz również podciągnąć odwrotność za pomocą:

git branch --no-merged master

Jeśli nie określisz master, np.

git branch --merged

wtedy pokażą ci gałęzie, które zostały scalone z bieżącym HEAD(więc jeśli jesteś włączony master, jest to równoważne z pierwszym poleceniem; jeśli jesteś włączony foo, to jest równoważne z git branch --merged foo).

Możesz także porównać odgałęzienia, określając -rflagę i odwołanie do sprawdzenia, które mogą być lokalne lub zdalne:

git branch -r --no-merged origin/master
Bursztyn
źródło
5
Jeśli połączyć foosię master, pojawi się na git branch --merged masterliście. Ale co się stanie, jeśli jeszcze raz się zobowiązujesz foo? Czy nie pojawia się już na tej liście, czy też, mimo że ma nowe zatwierdzenia, w pewnym momencie został scalony master?
Craig Otis
11
@CraigOtis Nie będzie już pojawiać się na liście. --mergedwyświetla tylko te gałęzie, które są całkowicie scalone z danym oddziałem.
Bursztynowy
i gitk --remotes --not origin/masterpokaże zatwierdzenia w każdym oddziale, które nie zostały połączone w master.
yoyo
5
Wyobraź sobie ... odpowiedź git, która jest łatwa do zrozumienia i użycia!
jleach
1
Czy istnieje sposób na uzyskanie listy bez sprawdzania oddziału? Jak wskazując na serwer, a następnie uzyskać listę?
xbmono
57

Możesz również użyć parametru -r, aby wyświetlić zdalne gałęzie, które nie zostały scalone w master:

git branch -r --merged master

git branch -r --no-merged
NemoXP
źródło
19
lub -aaby zobaczyć jednocześnie zdalne i lokalne w tym samym czasie
Simon Forsberg
1
Czy ten ostatni powinien być git branch -r --no-scalony master?
MortimerCat
28

Jeśli gałąź jest już scalona, ​​ponowne scalenie nic nie da. Nie musisz się więc martwić o „ponowne łączenie” już połączonych gałęzi.

Aby odpowiedzieć na twoje pytanie, możesz po prostu wydać

 git branch --merged

aby zobaczyć połączone oddziały lub

 git branch --no-merged

aby zobaczyć nie połączone gałęzie. Twoja obecna gałąź jest domyślna, ale możesz określić inne gałęzie, jeśli chcesz.

 git branch --no-merged integration

pokaże Ci gałęzie, które nie zostały jeszcze połączone w integrationgałąź.

Adam Dymitruk
źródło
1

Poniższy skrypt znajdzie wszystkie origin/*gałęzie, które wyprzedzają bieżącą gałąź

#!/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

Aktualna wersja skryptu

odlewnictwo
źródło
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;
użytkownik3915489
źródło