Wie kann ich sehen, wie viele Commits ein lokaler Zweig vor/hinter einem anderen lokalen Zweig in Git ist?

Lesezeit: 5 Minuten

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.

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/foound 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 Cs sind gemeinsame Commits, Ls 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:

  1. git rev-list foo --not origin/foo: Dies erzeugt eine Liste aller Commits auf foo aber nicht an origin/foo. Das heißt, beginnend bei origin/foo (was begehen ist U), den Commit streichen und alle früheren Commits erreichbar: das ist U und alle C begeht. Beginnen Sie dann bei foo und alle erreichbaren Commits finden, die noch nicht durchgestrichen sind: das sind nur die drei L begeht.

  2. Hinzufügen --count zum git rev-list Argumente, damit es anstelle der rohen Commit-ID-SHA-1-Werte eine Zählung ausgibt.

  3. Wiederholen Sie für git rev-list origin/foo --not foo: Dies sind alle Commits, die erreichbar sind origin/foo aber nicht von foowas in diesem Beispiel nur commit ist U. (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 masterkö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 masterund --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 mastervielleicht 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 masterwird 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

Benutzer-Avatar
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 als git 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


1049820cookie-checkWie kann ich sehen, wie viele Commits ein lokaler Zweig vor/hinter einem anderen lokalen Zweig in Git ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy