Antworten:
git branch --merged master
listet Zweige auf, die zum Master zusammengeführt wurden
git branch --merged
listet 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 -a
Flag zeigt sowohl lokale als auch entfernte Zweige an, und das -r
Flag zeigt nur die entfernten Zweige an.
git branch -a --merged/no-merged
funktioniert das auch, ohne dabei einen lokalen Tracking-Zweig zu erstellen.
git branch -r --merged/--no-merged
nur um entfernte Filialen zu finden.
--merged/--no-merged
ein optionales Festschreibungsargument erforderlich ist. Zumindest in meiner Version von git (1.9.1) führt das Hinzufügen des Flags -a
oder -r
danach zu einem schwerwiegenden Fehler. Fügen Sie das -a
oder -r
vorher hinzu --(no-)merged
.
Mit dem git merge-base
Befehl 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 -d
dies bereits geschieht, da ein nicht bereits vollständig zusammengeführter Zweig nicht gelöscht werden kann .
git branch -d
sich, einen Zweig zu löschen, der nicht mit dem aktuellen Zweig zusammengeführt wurde. Den aktuellen Zweig nicht löschen .
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
git
Clients ist. Unter Ubuntu , apt-get install gitk
.
brew install git-gui
, in gitk
die Kommandozeile zu gelangen .
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
}
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
git merge-base <commit-hash-step1> <commit-hash-step2>
. Weitere Informationen zu git merge-base https://git-scm.com/docs/git-merge-base .
master
es zusammengeführt wurde branch
, und dann wurden 4 weitere Commits hinzugefügt branch
.
git log -1 $(git merge-base base-branch feature-branch)
und wenn Sie feature-branch
in der Ausgabe sehen, dann wissen Sie, dass sie zusammengeführt werden?
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
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:
-a
flag - (alle) zeigt entfernte und lokale Zweige an-r
flag - (remote) zeigt nur entfernte Zweige an<emptyFlag>
- zeigt nur lokale NiederlassungenBeispiel: git branch -r --merged master
Zeigt Ihnen alle Remote-Repositorys an, die mit dem Master zusammengeführt wurden.
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.
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.
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
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.
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"
}
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]"
git log
Sie hinzufügen, --merges
um nur Zusammenführungs-Commits anzuzeigen. stackoverflow.com/a/25986615/134761
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.
git branch --merged
und löschte dann den lokalen und den Remote-Zweig.