Middle
Cum are loc unirea ramurilor (merge) sau rescrierea istoriei (rebase) în sistemul de control al versiunilor din compania ta?
sobes.tech AI
Răspuns de la AI
În echipa noastră, urmăm un flux de lucru bazat pe Git. Pentru a integra modificările, folosim două abordări principale: merge și rebase, alegându-le în funcție de situație și de tipul de ramură.
Merge:
- Se aplică în general pentru a uni ramuri de lungă durată, de exemplu dev în main, sau pentru a integra ramuri de funcționalități în dev.
- Creează un commit de fuziune care arată clar când a avut loc integrarea modificărilor din alte ramuri.
- Păstrează întregul istoric al commit-urilor, inclusiv toate ramificațiile.
git checkout dev // Trecem pe ramura țintă
git merge feature/noua-funcție // Fuzionăm ramura de funcționalitate
Rebase:
- Este folosit pentru a menține un istoric curat și liniar al commit-urilor în ramurile de funcționalitate până la integrarea lor (de obicei în dev).
- Transferă commit-urile ramurii curente pe vârful ramurii țintă (dev), rescriind efectiv istoria.
- Simplifică istoria, evitând commit-urile de tip merge pentru fiecare funcționalitate sau corectare mică.
- Important: Nu face rebase pe ramuri publice asupra cărora lucrează alți dezvoltatori, deoarece acest lucru poate crea conflicte la pull-ul modificărilor.
git checkout feature/noua-funcție // Trecem pe ramura de funcționalitate
git rebase dev // Transferăm commit-urile ramurii de funcționalitate pe vârful lui dev
// Rezolvăm conflictele dacă este necesar
git push --force-with-lease // Folosim --force-with-lease pentru un push sigur după rebase
Fluxul nostru de lucru standard:
- O nouă funcționalitate sau corectare este dezvoltată într-o ramură separată (feature/..., fix/...).
- Periodic (înainte de pull request sau pentru sincronizare cu dev), ramura de funcționalitate este rebase-ată pe versiunea actuală a lui dev. Acest lucru ajută la rezolvarea conflictelor în faze incipiente.
- După finalizarea dezvoltării și revizuirii codului, ramura de funcționalitate este fuzionată în
devcuno-ff(non-fast-forward), pentru a păstra informațiile despre fuziune. Sau, mai rar, este făcut un squash într-un singur commit înainte de a fi fuzionată îndevpentru modificări foarte mici sau corectări. - Din
dev, se fac lansări periodice înmain(ramura de producție), întotdeauna cu ajutorul merge-ului.
Astfel, echilibrăm păstrarea istoricului commit-urilor (merge) cu menținerea unei ramuri de dezvoltare curate (rebase a ramurilor de funcționalitate).