Wenn ich an einem Feature-Branch arbeite, würde ich gerne wissen, wie viele Commits dieser Branch vor oder hinter dem Master-Branch ist. Ich kann den Befehl, der dies tut, nicht finden.
Wie kann ich sehen, wie viele Commits ein lokaler Zweig vor/hinter einem anderen lokalen Zweig in Git ist?
Commits auflisten und zählen: git rev-list
Ein schneller Weg ist, was zu tun git status
tut, wenn es einen “Upstream” gibt. Speziell, git status
zählt einfach Revisionen, die sich im aktuellen Zweig befinden, die sich jedoch nicht im Upstream-Zweig befinden. Betrachten Sie zum Beispiel eine Verzweigung foo
das hat einen stromaufwärts von origin/foo
und nehmen wir an, Sie haben drei lokale Commits vorgenommen und dann verwendet git fetch
um einen Upstream-Commit einzufügen:
L - L - L <-- foo
/
... - C - C
\
U <-- origin/foo
Hier C
s sind gemeinsame Commits, L
s sind lokale Commits, und U
ist ein Upstream-Commit. Wenn Sie auf Zweig sind foo
und du rennst git status
Sie sehen “vor 3, hinter 1”.
So erhält Git diese Zahlen:
-
git rev-list foo --not origin/foo
: Dies erzeugt eine Liste aller Commits auffoo
aber nicht anorigin/foo
. Das heißt, beginnend beiorigin/foo
(was begehen istU
), den Commit streichen und alle früheren Commits erreichbar: das istU
und alleC
begeht. Beginnen Sie dann beifoo
und alle erreichbaren Commits finden, die noch nicht durchgestrichen sind: das sind nur die dreiL
begeht. -
Hinzufügen
--count
zumgit rev-list
Argumente, damit es anstelle der rohen Commit-ID-SHA-1-Werte eine Zählung ausgibt. -
Wiederholen Sie für
git rev-list origin/foo --not foo
: Dies sind alle Commits, die erreichbar sindorigin/foo
aber nicht vonfoo
was in diesem Beispiel nur commit istU
. (Erneut hinzufügen--count
um nur die Anzahl und nicht die tatsächlichen Commit-IDs zu erhalten.)
Beachten Sie, dass foo --not origin/foo
wird auch buchstabiert origin/foo..foo
in gitrevisionen Syntax. (Im Falle des git status
es ist immer auf der Suche aktuell Zweig – der via benannt ist HEAD
– und seine stromaufwärts. Du kannst den … benutzen @{upstream}
Syntax, um den Namen des Upstreams zu erhalten, oder kürzen Sie ihn zu @{u}
; und HEAD
ist die Standardeinstellung, wenn Sie überhaupt keinen Namen angeben; also neu implementieren git status
kann man sich nur anschauen git rev-list --count ..@{u}
und git rev-list --count @{u}..
.)
Verwenden rev-list
auf lokalen Zweigen, im Vergleich zur Verwendung git cherry
Wenn Sie also Commits zählen möchten, die von der Verzweigung aus erreichbar sind feature
aber nicht von Zweig master
können Sie dasselbe tun, aber mit den Namen feature
und master
. Das git rev-list
Syntax master..feature
benennt alle Commit-IDs, von denen aus sie erreichbar sind feature
aber nicht von master
und --count
erhalten Sie eine Zählung:
git rev-list --count master..feature
Wenn Sie jedoch einige Commits von einem Zweig zum anderen ausgewählt haben, sodass sie unterschiedliche Commit-IDs, aber denselben Unterschied haben, wird dies „überzählen“. Nehmen wir zum Beispiel an feature
hatte fünf Commits, die master
nicht, aber dann hatten Sie (oder jemand) entschieden, dass einer dieser fünf Commits ausgewählt werden sollte master
vielleicht hast du jetzt folgendes:
D - E - F - G - H <-- feature
/
... - C - C
\
F' <-- master
wo F'
ist im Grunde nur eine Kopie von commit F
. Wenn du fragst git rev-list
Commits zu zählen feature
die sind nicht an master
, du bekommst 5; aber wenn du fragst git cherry
um Commits zu finden feature
die sind nicht an master
wird es Commit eliminieren F
aus seiner Liste, weil es das sehen wird F'
ist eine Kopie von F
. Zählt man die aufgeführten Commits von git cherry
Sie erhalten daher 4, nicht 5.
-
Würden Sie also sagen, dass es besser (oder genauer) ist, die Drehzahlliste zu überschreiben?
– Rot2678
8. Februar 2021 um 10:34 Uhr
-
@ Red2678: Es ist besser, wenn Sie diese Nummer wollen; es ist schlimmer, wenn Sie die andere Nummer wollen. Das heißt, wollten Sie zählen begehtoder Commits mit unterschiedlichen Patch-IDs?
– Torek
8. Februar 2021 um 11:16 Uhr
-
@torrek Ich sehe, was du da gemacht hast;) Ich denke, es hängt dann wirklich von der Situation ab. Wenn Rosinenpickerei in der Umgebung gängige Praxis ist. dann möchten Sie sicherstellen, dass Sie sie zählen. Nachdem dies gesagt wurde, könnte ich dann wohl sagen, dass die Verwendung von Cherry “genauer” wäre, wenn Sie nicht wissen, ob jemand bei Commits Rosinen herausgesucht hat.
– Rot2678
8. Februar 2021 um 16:34 Uhr
pratZ
Verwenden git cherry
um die Commits zu finden, die in einem Zweig vorhanden sind und in einem anderen nicht vorhanden sind
git cherry -v master feature
Es listet alle im Feature-Zweig vorhandenen Commits auf, die im Master nicht vorhanden sind.
Ähnlich,
git cherry -v feature master
listet alle im Hauptzweig vorhandenen Commits auf, die nicht im Feature vorhanden sind.
Sie können auch einen zusätzlichen dritten Parameter zum Auswählen eines Startpunkts angeben.
git cherry -v feature master 1b219e
AKTUALISIEREN:
Sie können einen Alias erstellen, um die beiden zu kombinieren
[alias]
mydiff = !sh -c 'echo "Commits in $2 not in $1" && git cherry -v $1 $2 && echo "Commits in $1 not in $2" && git cherry -v $2 $1' -
Verwenden,
git mydiff master feature
-
Cool, danke. Gibt es eine Möglichkeit, auch alles in einem zu zählen, wie viele voraus, wie viele zurück?
– Zeit zu fliegen
10. Dezember 2014 um 17:54 Uhr
-
Sie können einen Alias erstellen
– pratZ
10. Dezember 2014 um 18:04 Uhr
-
Beachten Sie, dass
git cherry
vergleicht tatsächlich diffs, also ist es schicker alsgit status
‘s-Methode, die ich in einer separaten Antwort aufschreiben werde.– Torek
10. Dezember 2014 um 18:11 Uhr
-
@Blossoming_Flower Mir ist klar, dass dies zu spät zum Posten ist, aber ich brauchte das selbst, also kombinierte ich den obigen Alias und leitete ihn an wc -l weiter, das die Ausgabezeilen zählt. Mein Alias ist eingerichtet als
[alias] cdiffcount = !sh -c 'echo "Commits in $2 not in $1: " && git cherry $1 $2 | wc -l && echo "Commits in $1 not in $2: " && git cherry $2 $1 | wc -l' -
– Michael
15. Dezember 2015 um 23:44 Uhr