605 Stimmen

Mit Git alle Übertragungen anzeigen, die in einem Zweig, aber nicht in den anderen Zweigen sind

Ich habe einen alten Zweig, den ich gerne löschen möchte. Bevor ich dies tue, möchte ich jedoch überprüfen, ob alle an diesem Zweig vorgenommenen Übertragungen irgendwann in einen anderen Zweig zusammengeführt wurden. Ich möchte also alle Commits sehen, die in meinem aktuellen Zweig gemacht wurden und die nicht auf einen anderen Zweig angewendet wurden [oder, falls dies ohne Skripting nicht möglich ist, wie kann man alle Commits in einem Zweig sehen, die nicht auf einen anderen Zweig angewendet wurden].

0 Stimmen

Um fehlende Übertragungen zwischen zwei Zweigen aufzulisten, können Sie compare-branches.py verwenden bitbucket.org/aakef/compare-git-branches

0 Stimmen

739voto

jimmyorr Punkte 10280

Um eine Liste der Commits zu sehen, die sich in einem Branch befinden, aber nicht in einem anderen, verwenden Sie git log:

git log --no-merges oldbranch ^newbranch

...das heißt, Commit-Protokolle für alle Commits auf oldbranch anzeigen, die pas auf newbranch. Sie können mehrere Zweige auflisten, um sie ein- und auszuschließen, z. B.

git log  --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2

Hinweis: in der Windows-Eingabeaufforderung (nicht Powershell) ^ ist eine Escape-Taste und muss daher mit einer anderen ^ :

git log --no-merges oldbranch ^^newbranch

2 Stimmen

Ich habe es gefunden, als ich nach git compare commits von zwei Zweigen suchte.

43 Stimmen

Das ist genau das, wonach ich gesucht habe. Aber, mit ^ als Präfix verwirrt mich hier. In diesem Zusammenhang bedeutet es, diesen Zweig auszuschließen. Verwendung von ^ als Suffix wäre ein relativer Verweis auf die übergeordnete Übertragung dieses Zweigs.

4 Stimmen

Sehr nützlich, danke. Ich bin neugierig, warum ist das --no-merges Flag notwendig? Sicherlich möchte man auch diese Commits sehen?

360voto

Dustin Punkte 85400

Sie wollen wahrscheinlich nur

git branch --contains branch-to-delete

Dadurch werden alle Zweige aufgelistet, die die Commits von "branch-to-delete" enthalten. Wenn es mehr als nur "branch-to-delete" meldet, wurde der Zweig zusammengeführt.

Ihre Alternativen sind eigentlich nur Rev-List-Syntaxen, z. B. git log one-branch..another-branch zeigt alles, was one-branch muss alles haben another-branch hat.

Das könnte Sie auch interessieren git show-branch um zu sehen, was sich wo befindet.

2 Stimmen

1 Stimmen

Die Zeile "Wenn es etwas meldet, wurde der Zweig zusammengeführt" kann falsch interpretiert werden: wenn git branch --contains some-branch kehrt nur zurück some-branch dann gibt es zwar etwas zurück, aber es hat no zusammengeführt worden.

5 Stimmen

Beachten Sie, dass git log foo..bar zeigt die Commits zwischen bar's latest und foo's latest an, nicht aber andere Commits, die weiter zurückliegen. Um alles in bar, aber nicht in foo zu sehen, sollten Sie die Lösung von @jimmyorr verwenden.

130voto

Xuan Punkte 4898

Um die Übertragungen in oldbranch, aber nicht in newbranch anzuzeigen:

git log newbranch..oldbranch

Um den Unterschied zwischen diesen Übertragungen anzuzeigen (beachten Sie, dass es drei Punkte gibt):

git diff newbranch...oldbranch

Hier ist das Dokument mit einem Diagramm zur Veranschaulichung https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges

1 Stimmen

Véase Paul A. Jungwirths Kommentar oben. Es scheint, dass dadurch einige alte Übertragungen übersehen werden?

2 Stimmen

Ich bin mir nicht sicher, was alte Commits bedeuten. Die doppelten Punkte fordern Git im Grunde auf, eine Reihe von Commits aufzulösen, die von einem Commit aus erreichbar sind, aber von einem anderen aus nicht erreicht werden können. Hier ist die Doku mit einem Digramm zur Veranschaulichung git-scm.com/book/de/v2/

1 Stimmen

Und wenn wir uns entweder auf newbranch o oldbranch können wir tun git log ..oldbranch o git log newbranch.. bzw.

78voto

Tim S Punkte 4817

Für diejenigen, die immer noch nach einer einfachen Antwort suchen, gibt es folgende Informationen Git-Kirsche . Es vergleicht tatsächliche Diffs anstelle von Commit-Hashes. Das bedeutet, dass es auch Commits berücksichtigt, die "cherry picked" oder rebased wurden.

Checken Sie zunächst den Zweig aus, den Sie löschen möchten:

git checkout [branch-to-delete]

und vergleichen Sie ihn dann mit git cherry mit Ihrem Hauptentwicklungszweig:

git cherry -v master

Beispielhafte Ausgabe:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
- 85867e38712de930864c5edb7856342e1358b2a0 Yet another message

Anmerkung: Die -v ist es, die Commit-Nachricht zusammen mit dem SHA-Hash einzuschließen.

Zeilen mit einem vorangestellten '+' befinden sich im zu löschenden Zweig, aber nicht im Hauptzweig. Zeilen mit einem vorangestellten "-" haben eine entsprechende Übergabe im Master-Zweig.

Kombinieren Sie Cherry Pick mit Grep, um NUR die Commits zu finden, die nicht in Master sind:

git cherry -v master | grep "^\+"

Beispielhafte Ausgabe:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message

0 Stimmen

Ich habe dies versucht, aber es meldet immer noch, dass es viele Übertragungen im fb (Feature Branch) gibt, die nicht im mb (Main Branch) sind. Wenn ich mich jedoch im fb befinde und einen git diff mb ausführe, sehe ich keine Unterschiede. Ich habe rebase verwendet und alles zerquetscht. Ich bin fast sicher, dass dies der Grund ist, aber ich möchte nur sicher sein. Wenn dies der Fall ist, dann werde ich Squashing vermeiden, wenn überhaupt möglich; Ich bin in der "no lost info Lager." Ich frage mich, ob es möglich wäre, einen Protokollanzeigemodus hinzuzufügen, der Zusammenführungen so anzeigt, als wären sie Umbasierungen, um den Verlauf sauber zu halten und dennoch keine Informationen zu verlieren.

2 Stimmen

Ich bin mir nicht sicher, wie Ihr genaues Szenario aussieht, aber wenn Sie mehrere Commits zu einem einzigen zusammengefügt haben und diesen mit einem anderen Zweig vergleichen, in dem die Commits getrennt sind, wird das definitiv nicht funktionieren. In diesem Fall sollten Sie einfach die Unix diff um die verschiedenen Dateien zu vergleichen. Oder Sie könnten einen temporären Zweig erstellen und alle Übertragungen in diesem Zweig zerquetschen, ähnlich wie Sie es mit dem ursprünglichen Zweig getan haben, und dann dies verwenden, was meiner Meinung nach funktionieren würde.

52voto

Freddie Punkte 1009

Während einige der hier veröffentlichten Antworten helfen werden, das Gesuchte zu finden, ist der folgende Unterbefehl von Git-Zweig ist eine geeignetere Lösung für Ihre Aufgabe.

--zusammengefasst wird verwendet, um alle Zweige zu finden, die sicher gelöscht werden können, da diese Zweige vollständig in HEAD enthalten sind.

Während in master könnte man den Befehl ausführen, um die Zweige aufzulisten, die man gefahrlos entfernen kann, 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X