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.


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

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

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łąź.


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


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;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.