Branch-uri, merge și rebase
Lucru în paralel, merge vs rebase, fast-forward și conflicte.
Actualizat
Ce este un branch
Un branch e o linie paralelă de dezvoltare. Pornești de la main (codul stabil), lucrezi la un feature pe branch-ul tău, iar main rămâne neatins până când decizi să integrezi.
Tehnic, un branch e doar un pointer spre un commit — de aceea crearea lui e instantanee.
mainABCfeat/loginDEComenzi
| Comandă | Ce face |
|---|---|
git switch -c feat/login |
creează branch-ul și treci pe el |
git switch main |
treci pe alt branch |
git branch |
lista branch-urilor locale |
git merge feat/login |
integrează branch-ul în cel curent |
git rebase main |
mută commit-urile tale peste ultimul main |
git branch -d feat/login |
șterge branch-ul (după merge) |
Cum integrezi: merge vs rebase
| Merge | Rebase | |
|---|---|---|
| Ce face | creează un commit de merge care unește cele două istorii | rescrie commit-urile tale ca și cum ai fi pornit de la ultimul main |
| Istoric | arată exact ce s-a întâmplat, cu ramificații | liniar, mai ușor de citit |
| Rescrie istoria | nu | da (commit-uri noi, hash-uri noi) |
| Sigur pe branch-uri partajate | da | nu — doar pe branch-ul tău, înainte să-l împarți |
| Când | integrarea în main (de obicei prin PR) |
să-ți actualizezi branch-ul cu ultimele schimbări din main |
Fast-forward
Dacă main nu s-a mișcat de când ai creat branch-ul, merge-ul nu are nimic de „unit”: Git doar mută pointerul main înainte. Se numește fast-forward.
Înainte de merge:
mainABfeatCDDupă merge — main a fost doar mutat înainte, pe D:
mainABCDSquash merge
Toate commit-urile din branch devin un singur commit pe main. Popular pe GitHub: istoricul main rămâne curat (un commit per PR).
Conflicte
Apar când două branch-uri modifică aceleași linii. Git marchează locul:
<<<<<<< HEAD
const limit = 10
=======
const limit = 20
>>>>>>> feat/pagination
Alegi varianta corectă (sau le combini), ștergi marcajele, apoi git add + git commit (sau git rebase --continue). Editorul (VS Code) are butoane pentru asta.
Cum le eviți: branch-uri scurte (zile, nu săptămâni), actualizate des cu main.
Denumirea branch-urilor
feat/login-google
fix/cart-total-rounding
chore/upgrade-next-16
Prefixul spune tipul schimbării, restul — despre ce e vorba, kebab-case.
Pe scurt
- Branch = pointer spre un commit; lucrezi izolat de
main. - Merge păstrează istoria; rebase o face liniară, dar o rescrie — doar pe branch-ul tău.
- Branch-uri scurte = conflicte puține.