Finden Sie nicht zusammengeführte Git-Zweige?


276

Ich habe ein Git-Repository mit vielen Zweigen, von denen einige bereits zusammengeführt wurden und andere nicht. Wie kann ich feststellen, welche Zweige noch nicht zusammengeführt wurden, da die Anzahl der Zweige sehr groß ist? Ich möchte vermeiden, dass bereits zusammengeführte Zweige "Octopus" zusammengeführt und wieder zusammengeführt werden müssen.


1
Zuerst habe ich über den Begriff "Octopus Merge" gelacht. Aber falls Sie es nicht wussten, wie ich: Das ist der offizielle Name einer Zusammenführungsstrategie :-) Siehe git-scm.com/docs/git-merge oder atlassian.com/de/git/tutorials/using-branches/ Merge-Strategie
Beobachter

Antworten:


462

Versuche dies:

git branch --merged master

Es macht das, was es verspricht (listet Zweige auf, die zusammengeführt wurden master). Sie können die Umkehrung auch hochziehen mit:

git branch --no-merged master

Wenn Sie nicht angeben master, z.

git branch --merged

dann werden Ihnen Zweige angezeigt, die mit dem aktuellen zusammengeführt wurden HEAD(wenn Sie also aktiviert sind master, entspricht dies dem ersten Befehl; wenn Sie aktiviert sind foo, entspricht dies git branch --merged foo).

Sie können auch vorgelagerte Zweige vergleichen, indem Sie das -rFlag und einen zu prüfenden Verweis angeben, der lokal oder remote sein kann:

git branch -r --no-merged origin/master

5
Wenn Sie verschmelzen fooin master, wird es in der erscheinen git branch --merged masterListe. Aber was passiert, wenn Sie sich noch einmal dazu verpflichten foo? Erscheint es nicht mehr in dieser Liste oder wurde es, obwohl es neue Commits hat, an einem Punkt zusammengeführt master?
Craig Otis

11
@CraigOtis Es wird nicht mehr in der Liste angezeigt. --mergedlistet nur Zweige auf, die vollständig mit dem angegebenen Zweig zusammengeführt wurden.
Amber

und gitk --remotes --not origin/masterzeigt Ihnen die Commits für jeden Zweig, die nicht zum Master zusammengeführt wurden.
Yooy

5
Stellen Sie sich das vor ... eine Git-Antwort, die leicht zu verstehen und zu verwenden ist!
Jleach

1
Gibt es eine Möglichkeit, die Liste abzurufen, ohne die Filiale zu überprüfen? Möchten Sie auf den Server zeigen und dann die Liste erhalten?
Xbmono

57

Sie können auch den Parameter -r verwenden, um entfernte Zweige anzuzeigen, die nicht mit master zusammengeführt wurden:

git branch -r --merged master

git branch -r --no-merged

19
oder -aum sowohl entfernte als auch lokale gleichzeitig zu sehen
Simon Forsberg

1
Sollte das letzte Git-Zweig -r - kein zusammengeführter Master sein?
MortimerCat

28

Wenn ein Zweig bereits zusammengeführt ist, führt ein erneutes Zusammenführen nichts aus. Sie müssen sich also keine Sorgen machen, dass bereits zusammengeführte Zweige erneut zusammengeführt werden.

Um Ihre Frage zu beantworten, können Sie einfach ausstellen

 git branch --merged

um die zusammengeführten Zweige zu sehen oder

 git branch --no-merged

um die unberührten Zweige zu sehen. Ihr aktueller Zweig ist impliziert, Sie können jedoch auch andere Zweige angeben, wenn Sie dies wünschen.

 git branch --no-merged integration

zeigt Ihnen Zweige, die noch nicht zu integrationZweigen zusammengeführt wurden.


1

Das folgende Skript findet alle origin/*Zweige, die vor dem aktuellen Zweig liegen

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

Die aktuelle Version des Skripts


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;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.