Wie kann ich feststellen, ob ein Zweig bereits mit dem Master zusammengeführt wurde?

1139

Ich habe ein Git-Repository mit mehreren Zweigen.

Wie kann ich wissen, welche Zweige bereits mit dem Hauptzweig zusammengeführt wurden?

hectorsq
quelle

Antworten:

1792

git branch --merged masterlistet Zweige auf, die zum Master zusammengeführt wurden

git branch --mergedlistet in HEAD zusammengeführte Zweige auf (dh Spitze des aktuellen Zweigs)

git branch --no-merged listet Zweige auf, die nicht zusammengeführt wurden

Standardmäßig gilt dies nur für die lokalen Niederlassungen. Das -aFlag zeigt sowohl lokale als auch entfernte Zweige an, und das -rFlag zeigt nur die entfernten Zweige an.

hectorsq
quelle
2
Nur eine Randnotiz: Als ich versuchte festzustellen, ob ein Remote-Zweig zusammengeführt wurde, richtete ich zuerst einen lokalen Tracking-Zweig ein, identifizierte den Status mit git branch --mergedund löschte dann den lokalen und den Remote-Zweig.
Kenneth Kalmer
83
Anscheinend git branch -a --merged/no-mergedfunktioniert das auch, ohne dabei einen lokalen Tracking-Zweig zu erstellen.
Fresskoma
70
Oder git branch -r --merged/--no-mergednur um entfernte Filialen zu finden.
Asfand Qazi
5
Gibt es eine Möglichkeit, nicht zusammengeführte Zweige zu löschen, die nach dem erneuten Basieren tatsächlich zusammengeführt wurden?
Ashfame
9
Beachten Sie, dass danach --merged/--no-mergedein optionales Festschreibungsargument erforderlich ist. Zumindest in meiner Version von git (1.9.1) führt das Hinzufügen des Flags -aoder -rdanach zu einem schwerwiegenden Fehler. Fügen Sie das -aoder -r vorher hinzu --(no-)merged .
Jonathan Gawrych
113

Mit dem git merge-baseBefehl können Sie das letzte gemeinsame Commit zwischen den beiden Zweigen ermitteln. Wenn dieses Commit mit Ihrem Zweigkopf identisch ist, wurde der Zweig vollständig zusammengeführt.

Beachten Sie, dass git branch -ddies bereits geschieht, da ein nicht bereits vollständig zusammengeführter Zweig nicht gelöscht werden kann .

Greg Hewgill
quelle
3
Die Antwort von @ hari geht detaillierter auf die Verwendung ein.
Muhd
Wie können wir das automatisch / programmgesteuert tun?
Alexander Mills
1
"wurde noch nicht vollständig zusammengeführt" ... vollständig in welchen Zweig zusammengeführt?
Alexander Mills
@AlexanderMills: In Ihre aktuelle Filiale.
Greg Hewgill
2
@AlexanderMills: Weigert git branch -dsich, einen Zweig zu löschen, der nicht mit dem aktuellen Zweig zusammengeführt wurde. Den aktuellen Zweig nicht löschen .
Greg Hewgill
27

Es gibt auch eine grafische Schnittstellenlösung. Tippe einfach

gitk --all

In einem neuen Anwendungsfenster wird eine grafische Darstellung Ihres gesamten Repos angezeigt, in der Sie leicht erkennen können, ob ein Zweig bereits zusammengeführt wurde oder nicht

iberbeu
quelle
17
Um klar zu sein, muss eine Anwendung installiert werden, die nicht Teil des gitClients ist. Unter Ubuntu , apt-get install gitk.
Metame
Unter macOS, wenn Sie Homebrew installiert haben, wäre es brew install git-gui, in gitkdie Kommandozeile zu gelangen .
program247365
24

Ich benutze die folgende Bash-Funktion wie: 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
}
Carl G.
quelle
3
das funktioniert eigentlich nicht. Wenn der Quellzweig bereits mit dem Zielzweig zusammengeführt wurde und der Zielzweig dann noch ein paar Commits erhält, funktioniert er nicht mehr, aber ich weiß nicht warum
Alexander Mills
1
Siehe die Frage hier: stackoverflow.com/questions/51355331/…
Alexander Mills
18

Verwenden Sie git merge-base <commit> <commit>.

Dieser Befehl findet die besten gemeinsamen Vorfahren zwischen zwei Commits. Und wenn der gemeinsame Vorfahr mit dem letzten Commit eines "Zweigs" identisch ist, können wir davon ausgehen, dass ein "Zweig" bereits mit dem Master zusammengeführt wurde.

Hier sind die Schritte

  1. Suchen Sie den letzten Commit-Hash im Hauptzweig
  2. Finde den letzten Commit-Hash in einem "Zweig"
  3. Befehl ausführen git merge-base <commit-hash-step1> <commit-hash-step2>.
  4. Wenn die Ausgabe von Schritt 3 mit der Ausgabe von Schritt 2 identisch ist, wurde bereits ein "Zweig" in den Master zusammengeführt.

Weitere Informationen zu git merge-base https://git-scm.com/docs/git-merge-base .

Hari
quelle
2
Ich denke, das wird Ihnen nur sagen, wenn die Tipps zusammengeführt werden. Dies sagt Ihnen beispielsweise nicht, ob masteres zusammengeführt wurde branch, und dann wurden 4 weitere Commits hinzugefügt branch.
mkobit
Warum nicht git log -1 $(git merge-base base-branch feature-branch)und wenn Sie feature-branchin der Ausgabe sehen, dann wissen Sie, dass sie zusammengeführt werden?
Carl G
12

Zum Thema Aufräumen von Filialen

git branch -r | xargs -t -n 1 git branch -r --contains

Hier wird jeder Remote-Zweig aufgelistet, gefolgt von den Remote-Zweigen, in denen sich die neuesten SHAs befinden.

Dies ist nützlich, um zu erkennen, welche Remote-Zweige zusammengeführt, aber nicht gelöscht wurden und welche nicht zusammengeführt wurden und daher verfallen.

Wenn Sie 'tig' verwenden (es ist wie gitk, aber terminalbasiert), können Sie dies

tig origin/feature/someones-decaying-feature

um den Commit-Verlauf eines Zweigs zu sehen, ohne die Kasse verlassen zu müssen

xxjjnn
quelle
3
Gut gemacht, dieser Mann! Sehr nützlich, sobald Sie sich ein Bild davon gemacht haben, was tatsächlich angezeigt wird! Die GitHub-App muss dies in eine visuelle Anzeige Ihrer Zweige integrieren und nicht in eine alphabetische Liste ohne Hierarchie!
CMash
12

Um zu überprüfen, welche Zweige mit dem Master zusammengeführt werden, sollten Sie die folgenden Befehle verwenden:

  • git branch <flag[-r/-a/none]> --merged master Liste aller zum Master zusammengeführten Zweige.
  • git branch <flag[-r/-a/none]> --merged master | wc -l Anzahl der in den Master zusammengeführten Zweige zählen.

Flaggen sind:

  • -aflag - (alle) zeigt entfernte und lokale Zweige an
  • -rflag - (remote) zeigt nur entfernte Zweige an
  • <emptyFlag>- zeigt nur lokale Niederlassungen

Beispiel: git branch -r --merged master Zeigt Ihnen alle Remote-Repositorys an, die mit dem Master zusammengeführt wurden.

avivamg
quelle
5

Hier sind meine Techniken, wenn ich herausfinden muss, ob ein Zweig zusammengeführt wurde, auch wenn er möglicherweise neu basiert wurde, um mit unserem Hauptzweig auf dem neuesten Stand zu sein. Dies ist ein häufiges Szenario für Feature-Zweige.

Keiner dieser Ansätze ist narrensicher, aber ich habe sie oft als nützlich empfunden.

1 Protokoll für alle Zweige anzeigen

Verwenden Sie ein visuelles Tool wie gitk oder TortoiseGit oder einfach git log mit --all, und gehen Sie den Verlauf durch, um alle Zusammenführungen zum Hauptzweig anzuzeigen. Sie sollten erkennen können, ob dieser bestimmte Feature-Zweig zusammengeführt wurde oder nicht.

2 Entfernen Sie immer den Remote-Zweig, wenn Sie einen Feature-Zweig zusammenführen

Wenn Sie die Gewohnheit haben, beim Zusammenführen in einem Feature-Zweig immer sowohl den lokalen als auch den Remote-Zweig zu entfernen, können Sie die Fernbedienungen auf Ihrem anderen Computer einfach aktualisieren und bereinigen, und die Feature-Zweige verschwinden.

Um mich daran zu erinnern, verwende ich bereits Git-Flow-Erweiterungen (AVH Edition) , um meine Feature-Zweige lokal zu erstellen und zusammenzuführen. Daher habe ich den folgenden Git-Flow-Hook hinzugefügt, um mich zu fragen, ob ich den Remote-Zweig auch automatisch entfernen möchte.

Beispiel für einen Feature-Zweig zum Erstellen / Beenden

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

3 Suche nach Commit-Nachricht

Wenn Sie den Remote-Zweig nicht immer entfernen, können Sie dennoch nach ähnlichen Commits suchen, um festzustellen, ob der Zweig zusammengeführt wurde oder nicht. Die Gefahr hierbei besteht darin, dass der Remote-Zweig auf das nicht erkennbare zurückgesetzt wurde, z. B. das Quetschen von Commits oder das Ändern von Commit-Nachrichten.

  • Holen und beschneiden Sie alle Fernbedienungen
  • Suchen Sie die Nachricht des letzten Commits im Feature-Zweig
  • Überprüfen Sie, ob ein Commit mit derselben Nachricht im Hauptzweig gefunden werden kann

Beispielbefehle für den Hauptzweig:

gru                   
gls origin/feature/foo
glf "my message"

In meiner Bash .profile Konfiguration

alias gru='git remote update -p'
alias glf=findCommitByMessage

findCommitByMessage() {
    git log -i --grep="$1"
}
Angularsen
quelle
@anjdeas - Schritt 1 - Woher wissen Sie, welche Zweige zu main zusammengeführt wurden? Ich habe mir die Protokolle und GUI-Tools angesehen - und kann nirgendwo finden, wo dies explizit angezeigt wird ???
The Huff
@ TheHuff Versuchen Sie dies:git log --all --color --graph --decorate --topo-order --date=relative --abbrev-commit --pretty=format:"%C(green)%h %C(red bold)[%<(14)%ad] %Creset%s%Cred%d%C(blue) [%an]"
Angularsen
@TheHuff Wenn Sie sich in TortoiseGit im Hauptzweig befinden, sollten alle Zusammenführungen in main angezeigt werden.
Angularsen
Danke - aber woher weiß ich, was eine Zusammenführung ist? Ich gehe davon aus, dass es sich um Commits handelt - stimmt das?
Der Huff
@TheHuff: Sie sollten visuell sehen, wie zwei Streams / Pfade von Commits zu einem einzigen Commit "Downstream" zusammengeführt werden (weiter oben in der Protokollansicht). Dieses Commit ist ein Merge-Commit. Außerdem können git logSie hinzufügen, --mergesum nur Zusammenführungs-Commits anzuzeigen. stackoverflow.com/a/25986615/134761
angularsen
4

Hier ist ein kleiner Einzeiler, der Sie darüber informiert, ob Ihr aktueller Zweig Daten von einem entfernten Ursprung / Hauptzweig enthält oder nicht:

$ git fetch && git branch -r --merged | grep -q origin/master && echo Incorporates origin/master || echo Out of date from origin/master

Ich bin auf diese Frage gestoßen, als ich an einem Feature-Zweig gearbeitet habe und häufig sicherstellen wollte, dass ich die neuesten Arbeiten in meinen eigenen Arbeitszweig integriert habe.

Um diesen Test zu verallgemeinern, habe ich meiner ~ / .gitconfig den folgenden Alias ​​hinzugefügt:

[alias]
   current = !git branch -r --merged | grep -q $1 && echo Incorporates $1 || echo Out of date from $1 && :

Dann kann ich anrufen:

$ git current origin/master

um zu überprüfen, ob ich aktuell bin.

Radke
quelle