Ich habe einen alten Zweig, den ich löschen möchte. Zuvor möchte ich jedoch überprüfen, ob alle für diesen Zweig vorgenommenen Festschreibungen zu einem bestimmten Zeitpunkt in einem anderen Zweig zusammengeführt wurden. Daher möchte ich alle Commits für meinen aktuellen Zweig sehen, die nicht auf einen anderen Zweig angewendet wurden [oder, wenn dies ohne einige Skripte nicht möglich ist, wie sieht man alle Commits in einem Zweig, die nicht angewendet wurden? zu einem anderen gegebenen Zweig?].
git
branch
git-branch
Sircolinton
quelle
quelle
Antworten:
Sie wollen wahrscheinlich nur
Dadurch werden alle Zweige aufgelistet, die die Commits von "Branch-to-Delete" enthalten. Wenn mehr als nur "Branch-to-Delete" gemeldet wird, wurde der Zweig zusammengeführt.
Ihre Alternativen sind wirklich nur Rev-List-Syntax-Dinge. zB
git log one-branch..another-branch
zeigt alles wasone-branch
man haben muss allesanother-branch
hat.Sie könnten auch interessiert sein
git show-branch
, um zu sehen, was wo ist.quelle
git branch --contains some-branch
nur zurückgegeben wirdsome-branch
, wird etwas zurückgegeben, aber es wurde nicht zusammengeführt.git log foo..bar
die Commits zwischen dem neuesten und dem neuesten Balken angezeigt werden, jedoch keine anderen Commits, die in der Vergangenheit fehlen. Um alles in der Leiste zu sehen, aber nicht in foo, sollten Sie die Lösung von @ jimmyorr verwenden.Verwenden Sie git log, um eine Liste der Commits in einem Zweig anzuzeigen, jedoch nicht in einem anderen:
... das heißt, Commit-Protokolle für alle Commits auf oldbranch anzeigen, die nicht auf newbranch sind. Sie können mehrere Zweige zum Ein- und Ausschließen auflisten, z
Hinweis: Unter Windows
^
ist ein Escape-Schlüssel vorhanden, daher muss er mit einem anderen Escape-Schlüssel maskiert werden^
:quelle
^
als Präfix hier hat mich verwirrt. In diesem Zusammenhang bedeutet dies, diesen Zweig auszuschließen. Die Verwendung^
als Suffix wäre ein relativer Verweis auf das übergeordnete Commit dieses Zweigs.gitk oldbranch ^newbranch --no-merges
(Getestet mit Git 1.8.1.1). Randnotiz^
bedeutet für mich inklusive HEAD Commit of Branchnewbranch
.So zeigen Sie die Commits in Oldbranch, aber nicht in Newbranch:
Um den Unterschied durch diese Commits anzuzeigen (beachten Sie, dass es drei Punkte gibt):
Hier ist das Dokument mit einer Diagrammillustration https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges
quelle
newbranch
oderoldbranch
, was wir tun könnengit log ..oldbranch
odergit log newbranch..
jeweils..
zwischen den Namen der Schiedsrichter funktioniert . Ich habe auch die--cherry-pick
Option verwendet, um Commits auszublenden, die in beiden Zweigen vorhanden sind, aber einen anderen Hash haben, da sie von einem Zweig zum anderen ausgewählt wurden.Für diejenigen, die noch nach einer einfachen Antwort suchen, schauen Sie sich git cherry an . Es vergleicht tatsächliche Unterschiede anstelle von Commit-Hashes. Das bedeutet, dass Commits berücksichtigt werden, die von Kirschen gepflückt oder neu gegründet wurden.
Überprüfen Sie zuerst den Zweig, den Sie löschen möchten:
git checkout [branch-to-delete]
Verwenden Sie dann Git Cherry, um es mit Ihrem Hauptentwicklungszweig zu vergleichen:
git cherry -v master
Beispielausgabe:
Hinweis: Das
-v
Flag soll die Festschreibungsnachricht zusammen mit dem SHA-Hash enthalten.Zeilen mit dem '+' vor befinden sich in der zu löschenden Verzweigung, nicht jedoch in der Hauptverzweigung. Diejenigen mit einem '-' vor haben ein gleichwertiges Commit im Master.
Kombinieren Sie für NUR die Commits, die nicht im Master enthalten sind, Cherry Pick mit Grep:
git cherry -v master | grep "^\+"
Beispielausgabe:
quelle
diff
Dienstprogramm verwenden, um die verschiedenen Dateien zu vergleichen. Oder Sie können eine temporäre Verzweigung erstellen und alle Commits in dieser Form quetschen, ähnlich wie Sie es mit der ursprünglichen Verzweigung getan haben, und diese dann verwenden, was meiner Meinung nach funktionieren würde.Während einige der hier veröffentlichten Antworten helfen, das zu finden, wonach Sie suchen, ist der folgende Unterbefehl von git branch eine geeignetere Lösung für Ihre Aufgabe.
--merged 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
master
man den Befehl ausführen kann, um die Zweige aufzulisten, kann man sicher entfernen, wie folgt:quelle
Jimmyorrs Antwort funktioniert nicht unter Windows. es hilft zu verwenden
--not
anstatt^
wie folgt:quelle
^
dies unter Windows unterstützt wird, jedoch maskiert werden muss, was unter Windows (ein anderes) ist^
:git log oldbranch ^^newbranch --no-merges
.Wenn es sich um einen (einzelnen) Zweig handelt, den Sie überprüfen müssen, z. B. wenn dieser Zweig 'B' vollständig mit Zweig 'A' zusammengeführt werden soll, können Sie einfach Folgendes tun:
git branch -d <branchname>
hat die Sicherheit, dass "Der Zweig muss vollständig in HEAD zusammengeführt werden."Achtung : Dadurch wird der Zweig B tatsächlich gelöscht, wenn er mit A zusammengeführt wird.
quelle
Mit diesem einfachen Skript können Sie Commits anzeigen, die nicht zusammengeführt werden
Sie können auch das Tool git-wtf verwenden , das den Status von Zweigen anzeigt
quelle
Verwenden Sie einfach
git cherry
, um alle Commits in der Filiale auszuwählen,newFeature42
zum Beispiel:Git Cherry -v Master NewFeature42
quelle
Start , um einen Pull - Request zu erstellen über den git - Hosting - Service Sie verwenden. Wenn der Zweig vollständig mit dem Basiszweig zusammengeführt wurde, können Sie den neuen PR nicht erstellen.
Sie müssen die Pull-Anforderung nicht tatsächlich stellen, sondern verwenden nur den ersten Schritt, in dem Sie Zweige auswählen.
Zum Beispiel auf GitHub:
Dies verwendet kein Git in der Befehlszeile, aber ich finde es oft hilfreich, die anderen Tools, die Ihnen zur Verfügung stehen, mit einem klaren mentalen Modell zu verwenden, anstatt zu versuchen, sich an einen anderen arkanen Git-Befehl zu erinnern.
quelle