Mit Git, alle Commits zeigen, die in einem Zweig sind, aber nicht die andere (n)
-
19-09-2019 - |
Frage
Ich habe einen alten Zweig, die Ich mag würde löschen. Doch bevor dies zu tun, mag ich überprüfen, ob alle gemacht Commits zu diesem Zweig waren irgendwann in einen anderen Zweig verschmolzen. So würde Ich mag alle meine aktuellen Zweig Commits gemacht, um zu sehen, die nicht auf andere Zweig angewendet worden [oder, wenn dies ohne einige scripting nicht möglich ist, wie man alle Commits in einem Zweig sieht, die nicht angewandt worden sind zu einem anderen bestimmten Zweig?].
Lösung
Sie wahrscheinlich nur wollen
git branch --contains branch-to-delete
Damit werden alle Zweige Liste, die die Festschreibungen von „Branch-to-delete“ enthalten. Wenn es meldet mehr als nur „Branch-to-delete“ hat sich die Niederlassung zusammengeführt.
Ihre Alternativen sind wirklich nur rev-Liste Syntax Dinge. z.B. git log one-branch..another-branch
zeigt alles, was one-branch
braucht, alles zu haben another-branch
hat.
Sie können auch in git show-branch
als eine Möglichkeit, daran interessiert zu sehen, was dort.
Andere Tipps
eine Liste Um zu sehen, von denen Commits auf einem Zweig, aber nicht eine andere, verwenden Sie git log:
git log --no-merges oldbranch ^newbranch
... das heißt, zeigen Protokolle verpflichten für alle auf oldbranch verpflichtet, die nicht auf newbranch. Sie können mehrere Zweige Liste aufzunehmen und ausschließen, z.
git log --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2
Hinweis: unter Windows ^
ist eine Escape-Taste, so muss es mit einem anderen ^
maskiert werden:
git log --no-merges oldbranch ^^newbranch
Um die Commits in oldbranch zu zeigen, aber nicht in newbranch:
git log newbranch..oldbranch
Um die diff durch diese Commits zu zeigen (man beachte, gibt es drei Punkte):
git diff newbranch...oldbranch
Hier ist die doc mit einer Diagrammdarstellung https: // git -scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges
Für diejenigen, die noch für eine einfache Antwort suchen Besuche git cherry . Es vergleicht tatsächliche Diffs anstelle Hashes begehen. Das heißt, es Commits bietet Platz für die gewesen Kirsche gepflückt haben oder indexiert.
Sie zuerst den Zweig Kasse Sie löschen möchten:
git checkout [branch-to-delete]
dann git Kirsche verwenden, um es zu einem Hauptentwicklungszweig zu vergleichen:
git cherry -v master
Beispiel Ausgabe:
+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
- 85867e38712de930864c5edb7856342e1358b2a0 Yet another message
. Hinweis: Der -v
Flag ist die Commit-Nachricht zusammen mit der SHA Hashwert schließen
Zeilen mit dem ‚+‘ vor sind in der Branche zu löschen, aber nicht der Master-Zweig. Diejenigen mit einem '-' vor einem äquivalenten haben begehen in Master
.Für nur die Commits, die nicht in Master sind, kombinieren Kirsche pflücken mit grep:
git cherry -v master | grep "^\+"
Beispiel Ausgabe:
+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
Während einige der hier gepostet Antworten finden, was Sie suchen, der folgende Unterbefehl von git branch ist eine geeignetere Lösung für Ihre Aufgabe.
Während in master
könnte man den Befehl ausführen, um die Zweige aufzuzählen man sicher entfernen können, etwa so:
git branch --merged
develop
fpg_download_links
* master
master_merge_static
# Delete local and remote tracking branches you don't want
git branch -d fpg_download_links
git push origin :fpg_download_links
git branch -d master_merge_static
git push origin :master_merge_static
# There is also a flag to specify remote branches in the output
git branch --remotes --merged
jimmyorr Antwort funktioniert nicht unter Windows. es hilft --not
statt ^
wie so zu verwenden:
git log oldbranch --not newbranch --no-merges
Wenn es ein (single) Niederlassung, die Sie brauchen, um zu überprüfen, zum Beispiel, wenn Sie diesen Zweig ‚B‘ wollen, ist vollständig in den Zweig ‚A‘ verschmolzen, können Sie einfach wie folgt vor:
$ git checkout A
$ git branch -d B
git branch -d <branchname>
hat die Sicherheit, dass "Der Zweig muss vollständig in HEAD zusammengeführt werden."
Achtung: : dies tatsächlich löscht den Zweig B, wenn es in A zusammengeführt wird
.Sie können dieses einfache Skript Commits zu sehen, die nicht zusammengeführt werden
#!/bin/bash
# Show commits that exists only on branch and not in current
# Usage:
# git branch-notmerge <branchname>
#
# Setup git alias
# git config alias.branch-notmerge [path/to/this/script]
grep -Fvf <(git log --pretty=format:'%H - %s') <(git log $1 --pretty=format:'%H - %s')
Sie können mit auch Werkzeug git-wtf diesem Zustand der Filialen wird angezeigt
Starten Sie auf Erstellen Sie eine Pull-Request über den git Hosting-Service Sie verwenden. Wenn der Zweig wurde in die Basiszweig vollständig verschmolzen, werden Sie nicht in der Lage sein, die neuen PR zu erstellen.
Sie brauchen nicht wirklich, um die Pull-Anforderung zu machen, benutzen Sie einfach den ersten Schritt, wo Sie Zweige pflücken.
Zum Beispiel auf GitHub:
Es gibt nichts zu vergleichen
Dies verwendet nicht git auf der Kommandozeile, aber ich finde es oft hilfreich, die anderen Werkzeuge zur Verfügung, mit einem klaren mentalen Modell zu verwenden, anstatt einem anderen obskuren git Befehl zu erinnern zu versuchen.