Ich möchte alle Commits auflisten, die nur Teil eines bestimmten Zweigs sind.
Im Folgenden werden alle Commits aus dem Zweig, aber auch aus dem übergeordneten (Master) aufgelistet.
git log mybranch
Die andere Option, die ich gefunden habe, war, die vom Master erreichbaren Commits auszuschließen und mir zu geben, was ich will, ABER ich möchte vermeiden, dass ich die Namen der anderen Zweige kennen muss.
git log mybranch --not master
Ich habe versucht, es zu verwenden git for-each-ref
, aber es listet auch mybranch auf, so dass es eigentlich alle ausschließt:
git log mybranch --not $(git for-each-ref --format '^%(refname:short)' refs/heads/)
Aktualisieren:
Ich teste eine neue Option, die ich vor einiger Zeit gefunden habe, und bis jetzt scheint es, dass dies das sein könnte, wonach ich gesucht habe:
git log --walk-reflogs mybranch
Update (2013-02-13T15: 08):
Die Option --walk-reflogs ist gut, aber ich habe überprüft, ob ein Ablauf für Reflogs vorliegt (Standard 90 Tage, gc.reflogExpire ).
Ich glaube, ich habe die Antwort gefunden, nach der ich gesucht habe:
git log mybranch --not $(git for-each-ref --format='%(refname)' refs/heads/ | grep -v "refs/heads/mybranch")
Ich entferne nur den aktuellen Zweig aus der Liste der verfügbaren Zweige und verwende diese Liste, um aus dem Protokoll ausgeschlossen zu werden. Auf diese Weise erhalte ich nur die Commits, die nur von mybranch erreicht werden .
Antworten:
Wie es sich anhört, sollten Sie Folgendes verwenden
cherry
:Dies würde alle Commits anzeigen , die in mybranch enthalten sind , aber NICHT in Entwicklung sind . Wenn Sie die letzte Option ( mybranch ) weglassen , wird stattdessen der aktuelle Zweig verglichen.
Wie VonC betonte, vergleichen Sie Ihre Niederlassung IMMER mit einer anderen Niederlassung. Kennen Sie also Ihre Niederlassungen und wählen Sie dann die Niederlassung aus, mit der Sie vergleichen möchten.
quelle
git cherry -v master
Ihren aktuellen Zweig mit dem Hauptzweig vergleichen.fatal: Unknown commit mybranch
.Ich denke nicht, dass dies möglich ist: Ein Zweig in Git basiert immer auf einem anderen oder zumindest auf einem anderen Commit, wie in " Git Diff zeigt nicht genug " erläutert :
Sie benötigen einen Referenzpunkt für Ihr Protokoll, um die richtigen Commits anzuzeigen.
Wie in " GIT - Woher habe ich verzweigt? " Erwähnt :
Selbst wenn
git log master..mybranch
es sich um eine Antwort handelt, werden immer noch zu viele Commits angezeigt, wenn siemybranch
aufmyotherbranch
selbst basierenmaster
.Um diese Referenz (den Ursprung Ihres Zweigs) zu finden, können Sie nur Commits analysieren und sehen, in welchem Zweig sie sich befinden, wie in:
quelle
Ich habe endlich den Weg gefunden, das zu tun, was das OP wollte. Es ist so einfach wie:
Der Befehl zeigt alle Commits, die über den bereitgestellten Zweig erreichbar sind, im Diagrammformat an. Sie können jedoch problemlos alle Commits in diesem Zweig filtern, indem Sie
*
sich das Commit- Diagramm ansehen, dessen erstes Zeichen in der Commit-Zeile steht.Schauen wir uns zum Beispiel den folgenden Auszug aus dem
git log --graph master
pieHp-GitHub-Repo an:Wie Sie nur Commits sehen können
8314c2ff833280bbc7102cb6d4fcf62240cd3ac4
undc3f45e811e4b49fe27624b57c3eb8f4721a4323b
das haben*
ist das erste Zeichen in den Linien zu begehen. Diese Commits stammen aus dem Hauptzweig, während die anderen vier aus einigen anderen Zweigen stammen.quelle
Der folgende Shell-Befehl sollte das tun, was Sie wollen:
Vorsichtsmaßnahmen
Wenn Sie
mybranch
ausgecheckt haben, funktioniert der obige Befehl nicht. Das liegt daran, dass die Commitsmybranch
auch für erreichbar sindHEAD
, sodass Git die Commits nicht als eindeutig betrachtetmybranch
. Damit es beimmybranch
Auschecken funktioniert , müssen Sie auch einen Ausschluss hinzufügen fürHEAD
:Sie sollten jedoch nicht ausschließen, es
HEAD
sei denn, dasmybranch
ist ausgecheckt, da Sie sonst das Risiko eingehen, Commits anzuzeigen, die nicht exklusiv für sindmybranch
.Wenn Sie einen Remote-Zweig mit dem Namen haben
origin/mybranch
, der dem lokalenmybranch
Zweig entspricht, müssen Sie ihn ebenfalls ausschließen:Und wenn der Remote-Zweig der Standardzweig für das Remote-Repository ist (normalerweise nur für
origin/master
), müssen Sie auch Folgendes ausschließenorigin/HEAD
:Wenn Sie den Zweig ausgecheckt haben und es einen Remote-Zweig gibt und der Remote-Zweig der Standard für das Remote-Repository ist, schließen Sie am Ende eine Menge aus:
Erläuterung
Der
git rev-list
Befehl ist ein Befehl auf niedriger Ebene (Sanitär), der die angegebenen Revisionen durchläuft und die gefundenen SHA1-Kennungen ausgibt. Betrachten Sie es als äquivalent zu,git log
außer dass nur der SHA1 angezeigt wird - keine Protokollnachricht, kein Autorenname, kein Zeitstempel, nichts von diesem "ausgefallenen" Zeug.Die
--no-walk
Option verhindert, wie der Name schon sagt, dasgit rev-list
Gehen über die Ahnenkette. Wenn Sie also eingebengit rev-list --no-walk mybranch
, wird nur eine SHA1-Kennung ausgegeben: die Kennung des Tip-Commits desmybranch
Zweigs.Die
--exclude=refs/heads/mybranch --all
Argumente sagengit rev-list
, dass mit Ausnahme von jeder Referenz begonnen werden sollrefs/heads/mybranch
.Wenn Sie also ausführen
git rev-list --no-walk --exclude=refs/heads/mybranch --all
, druckt Git die SHA1-Kennung des Tip-Commits jeder Referenz mit Ausnahme vonrefs/heads/mybranch
. Diese Commits und ihre Vorfahren sind die Commits, an denen Sie nicht interessiert sind - dies sind die Commits, die Sie nicht sehen möchten.Die anderen Commits sind diejenigen, die Sie sehen möchten. Daher sammeln wir die Ausgabe von
git rev-list --no-walk --exclude=refs/heads/mybranch --all
und weisen Git an, alles außer diesen Commits und ihren Vorfahren anzuzeigen.Das
--no-walk
Argument ist für große Repositorys erforderlich (und ist eine Optimierung für kleine Repositorys): Ohne es müsste Git drucken und die Shell müsste viel mehr Festschreibungskennungen als erforderlich sammeln (und im Speicher speichern). Bei einem großen Repository kann die Anzahl der gesammelten Commits die Befehlszeilenargumentgrenze der Shell leicht überschreiten.Git Bug?
Ich hätte erwartet, dass Folgendes funktioniert:
aber es tut nicht. Ich vermute, das ist ein Fehler in Git, aber vielleicht ist es beabsichtigt.
quelle
hg log -b <branch>
. Ich verstehe nicht, warum Leute sagen, dass Git unfreundlich ist. / sgit log --all --not --exclude=refs/heads/mybranch --all
es nicht funktioniert, aber esgit log refs/heads/mybranch --not --exclude=refs/heads/mybranch --all
funktioniert, mit den gleichen Einschränkungen bezüglich des Ausschlusses von KOPF und Herkunft.Schnelle Antwort:
Sagen wir:
Dass Sie haben einen Master - Zweig
Mach ein paar Commits
Sie haben einen Zweig mit dem Namen b2 erstellt
Tun
git log -n1
; Die Commit-ID ist die Zusammenführungsbasis zwischen b2 und masterMachen Sie ein paar Commits in b2
git log
zeigt Ihren Protokollverlauf von b2 und master anVerwenden Sie den Festschreibungsbereich. Wenn Sie mit dem Konzept nicht vertraut sind, lade ich Sie ein, es zu googeln oder Überlauf zu stapeln.
Für Ihren tatsächlichen Kontext können Sie dies beispielsweise tun
Das ".." ist der Bereichsoperator für den Protokollbefehl.
Das heißt, geben Sie mir in einer einfachen Form alle Protokolle, die aktueller sind als commitID_FOO ...
Schauen Sie sich Punkt 4 an, die Zusammenführungsbasis
Also:
git log COMMITID_mergeBASE..HEAD
zeigt dir den UnterschiedGit kann die Zusammenführungsbasis für Sie so abrufen
Endlich können Sie tun:
quelle
Sie könnten so etwas versuchen:
Oder leihen Sie sich das Rezept im Git-Benutzerhandbuch aus :
quelle
git show-ref --tags
.listet die Tipps aller Zweige auf, die es nicht sind
master
.listet jedes Commit in
master
der Historie auf, das nicht in der Historie eines anderen Zweigs enthalten ist.Die Sequenzierung ist wichtig für die Optionen, mit denen die Filterpipeline für die Auswahl von Commits eingerichtet wird. Sie
--branches
muss daher allen Ausschlussmustern--no-walk
folgen, die angewendet werden sollen, und muss den Filtern folgen, die Commits liefern. Die Rev-Liste soll nicht laufen.quelle
Dadurch werden die Commits für den aktuellen Zweig ausgegeben. Wenn ein Argument übergeben wird, werden nur die Hashes ausgegeben.
git_show_all_commits_only_on_this_branch
quelle
Ich benutze die folgenden Befehle:
oder
quelle
Ich fand diesen Ansatz relativ einfach.
Kasse zur Filiale und dann
Lauf
Dies liefert nur zwei SHAs:
1) letztes Commit des Zweigs [C1]
2) und übergeordnetes Element für das erste Festschreiben des Zweigs festlegen [C2]
Jetzt renn
Hier sind C1 und C2 zwei Zeichenfolgen, die Sie erhalten, wenn Sie den ersten Befehl ausführen. Setzen Sie diese Werte ohne <> in den zweiten Befehl.
Dies gibt eine Liste des Verlaufs der Dateiänderung innerhalb des Zweigs.
quelle
In meiner Situation verwenden wir Git Flow und GitHub. Dazu benötigen Sie lediglich Folgendes: Vergleichen Sie Ihren Feature-Zweig mit Ihrem Entwicklungszweig auf GitHub.
Es werden die Commits angezeigt, die nur für Ihren Feature-Zweig vorgenommen wurden.
Beispielsweise:
https://github.com/your_repo/compare/develop...feature_branch_name
quelle
git
GitHub zu ignorieren und stattdessen nur eine Pull-Anfrage zu stellen oder die Zweige zu vergleichen.