Der folgende Shell-Befehl sollte das tun, was Sie wollen:
git log --all --not $(git rev-list --no-walk --exclude=refs/heads/mybranch --all)
Vorsichtsmaßnahmen
Wenn Sie mybranchausgecheckt haben, funktioniert der obige Befehl nicht. Das liegt daran, dass die Commits mybranchauch für erreichbar sind HEAD, sodass Git die Commits nicht als eindeutig betrachtet mybranch. Damit es beim mybranchAuschecken funktioniert , müssen Sie auch einen Ausschluss hinzufügen für HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD \
--all)
Sie sollten jedoch nicht ausschließen, es HEADsei denn, das mybranchist ausgecheckt, da Sie sonst das Risiko eingehen, Commits anzuzeigen, die nicht exklusiv für sind mybranch.
Wenn Sie einen Remote-Zweig mit dem Namen haben origin/mybranch, der dem lokalen mybranchZweig entspricht, müssen Sie ihn ebenfalls ausschließen:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--all)
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ßen origin/HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
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:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
Erläuterung
Der git rev-listBefehl 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 logaußer dass nur der SHA1 angezeigt wird - keine Protokollnachricht, kein Autorenname, kein Zeitstempel, nichts von diesem "ausgefallenen" Zeug.
Die --no-walkOption verhindert, wie der Name schon sagt, das git rev-listGehen über die Ahnenkette. Wenn Sie also eingeben git rev-list --no-walk mybranch, wird nur eine SHA1-Kennung ausgegeben: die Kennung des Tip-Commits des mybranchZweigs.
Die --exclude=refs/heads/mybranch --allArgumente sagen git rev-list, dass mit Ausnahme von jeder Referenz begonnen werden soll refs/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 von refs/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 --allund weisen Git an, alles außer diesen Commits und ihren Vorfahren anzuzeigen.
Das --no-walkArgument 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:
git log --all --not --exclude=refs/heads/mybranch --all
aber es tut nicht. Ich vermute, das ist ein Fehler in Git, aber vielleicht ist es beabsichtigt.