În timpul dezvoltării unei funcționalități, istoricul de commit-uri devine adesea haotic, conținând mesaje triviale de tipul ‘wip’, ‘mic fix’, ‘test din nou’ sau ‘am uitat un punct și virgulă’. Trimiterea acestui istoric murdar în producție poluează jurnalul de audit al echipei.
Comanda git rebase -i (Interactive Rebase) deschide o listă interactivă a ultimelor `n` commit-uri într-un editor de text, permițându-ți să dictezi precis destinul fiecăruia: poți comasa 5 commit-uri mici într-unul singur curat (`squash`), poți schimba mesajul unui commit (`reword`) sau poți șterge un commit accidental (`drop`).
Această practică este standardul de aur în companiile profesionale înainte de deschiderea unui Pull Request, asigurând un istoric liniar și ușor de inspectat pe termen lung.
Sintaxă, opțiuni și concepte cheie
| Opțiune / Concept | Descriere practică |
|---|---|
pick |
Păstrează commit-ul așa cum este în istoric. |
squash |
Unește modificările acestui commit cu cel anterior și deschide editorul pentru un mesaj comun. |
fixup |
Unește modificările cu commit-ul anterior, dar aruncă complet mesajul redundant. |
reword |
Păstrează modificările de cod, dar permite reformularea mesajului de commit. |
drop |
Șterge complet commit-ul din istoricul ramurii. |
Exemple practice și cod
Exemplul 1: Comasarea a 3 commit-uri într-unul singur curat înainte de Pull Request
Cum se curăță istoricul folosind directiva `squash`.
# Deschidem ultimele 3 commit-uri în mod interactiv:
$ git rebase -i HEAD~3
# În editorul ce se deschide automat:
pick 1a2b3c4 Adaugă endpoint de autentificare JWT
squash 2b3c4d5 Mic fix la parsarea tokenului
squash 3c4d5e6 Adaugă teste unitare
# Salvăm fișierul. Git comasează totul într-un singur commit curat:
[detached HEAD 8f9e0a1] Feature: Autentificare JWT cu suita completă de teste unitare
3 files changed, 140 insertions(+)
Rezultat & Impact
Istoricul de git devine impecabil și gata de aprobare la code review.
Greșeli frecvente și bune practici
- Rularea `git rebase -i` pe o ramură publică partajată (cum ar fi `main` sau `master`), ceea ce rescrie istoricul și creează divergențe grave pentru colegii de echipă.
- Ștergerea din greșeală a unei linii din fișierul de rebase, ceea ce duce la abandonarea (drop) definitivă a acelui commit.