git range-diff în Git

Compară două versiuni ale aceleiași serii de commit-uri (de exemplu înainte și după un rebase) și arată ce s-a schimbat în fiecare commit.

Sintaxă comandă
git range-diff <bază1>..<vârf1> <bază2>..<vârf2>
git range-diff <vârf1>...<vârf2>

Ce face git range-diff

După un git rebase sau după ce corectezi commit-urile cerute la code review, toate hash-urile se schimbă. git range-diff pune față în față seria veche și seria nouă, potrivește commit-urile între ele și îți arată, pentru fiecare pereche, dacă sunt identice sau ce diferă.

În ieșire, = înseamnă că modificarea din commit este aceeași, ! că s-a schimbat (urmează un „diff al diff-urilor”), < că commit-ul există doar în seria veche, iar > doar în cea nouă. Pentru a vedea seria veche după rebase, folosește o ramură salvată înainte sau git reflog (de exemplu feature@{1}).

Opțiuni și argumente

Opțiune / Parametru Descriere
A..B C..D Compară seria de commit-uri A..B (veche) cu C..D (nouă).
X...Y Forma scurtă: compară commit-urile de la baza comună până la X cu cele până la Y.
--creation-factor=N Cât de diferite pot fi două commit-uri ca să fie considerate pereche (implicit 60); mărește-l dacă perechile nu sunt găsite.
--no-dual-color Colorează doar diff-ul diff-urilor, nu și liniile originale.
-s, --no-patch Arată doar tabelul de perechi, fără diferențe.

Exemple

Exemplul 1: Ce s-a schimbat după rebase și corectare

Ramura feature/cos a fost mutată peste main, iar al doilea commit a fost corectat (TVA 21% în loc de 19%). Primul commit e identic (=), al doilea s-a schimbat (!). Datele sunt fixate, ca hash-urile să fie stabile.

export GIT_AUTHOR_DATE="2026-10-20T10:00:00+03:00" GIT_COMMITTER_DATE="2026-10-20T10:00:00+03:00"
git init -q -b main magazin
cd magazin
git config user.name "Ana Popescu" && git config user.email "ana@exemplu.ro"
echo 'Produse' > produse.txt && git add . && git commit -q -m "Start"
git switch -q -c feature/cos
printf 'def adauga(cos, produs):\n    cos.append(produs)\n' > cos.py
git add . && git commit -q -m "Cos de cumparaturi"
printf 'def total(cos):\n    suma = sum(p.pret for p in cos)\n    return suma * 1.19\n' > total.py
git add . && git commit -q -m "Calcul total"
git branch cos-v1
git switch -q main
echo 'Telefon 1200 lei' >> produse.txt && git commit -q -am "Produs nou pe main"
git switch -q feature/cos
git rebase -q main
sed -i.bak 's/1.19/1.21/' total.py && rm total.py.bak
git commit -q --amend -a --no-edit
git range-diff --creation-factor=95 main~1..cos-v1 main..feature/cos

Rezultat

1:  7dd995b = 1:  3a913ca Cos de cumparaturi
2:  cbb7fcc ! 2:  a46e7f5 Calcul total
    @@ total.py (new)
     @@
     +def total(cos):
     +    suma = sum(p.pret for p in cos)
    -+    return suma * 1.19
    ++    return suma * 1.21

Exemplul 2: Comparație rapidă după un push forțat

Un coleg a rescris ramura de pe server. Comparăm vechea poziție (din reflog) cu cea nouă, doar ca tabel de perechi.

git fetch origin
git range-diff -s origin/feature/cos@{1}...origin/feature/cos

Ieșire în terminal

1:  7dd995b = 1:  3a913ca Cos de cumparaturi
2:  cbb7fcc ! 2:  a46e7f5 Calcul total
-:  ------- > 3:  5c0e2d1 Livrare gratuita peste 200 lei

Greșeli frecvente

  • Compararea cu git diff vechi nou: arată diferența dintre stările finale ale codului și include și modificările venite din main prin rebase, nu ce s-a schimbat în fiecare commit al seriei.
  • Pierderea seriei vechi: salvează o ramură înainte de rebase (git branch cos-v1) sau folosește reflog-ul (feature/cos@{1}) cât timp intrarea există.

Comenzi înrudite

  • git rebase: Reaplică commit-urile din ramura curentă peste o altă ramură, creând un istoric perfect liniar.
  • git reflog: Jurnalul de siguranță al depozitului: înregistrează fiecare mutare a indicatorului HEAD și permite recuperarea commit-urilor pierdute.
  • git diff: Afișează diferențele de cod (linie cu linie) între directorul de lucru, staging sau două versiuni diferite.