Sobes.tech
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:

  1. O nouă funcționalitate sau corectare este dezvoltată într-o ramură separată (feature/..., fix/...).
  2. 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.
  3. După finalizarea dezvoltării și revizuirii codului, ramura de funcționalitate este fuzionată în dev cu no-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ă în dev pentru modificări foarte mici sau corectări.
  4. Din dev, se fac lansări periodice în main (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).