Middle
Kako u vašoj kompaniji dolazi do spajanja grana (merge) ili prepisivanja istorije (rebase) u sistemu kontrole verzija?
sobes.tech АИ
Одговор од АИ
U našem timu sledimo radni tok zasnovan na Git-u. Za integraciju promena koristimo dva glavna pristupa: merge i rebase, birajući ih u zavisnosti od situacije i tipa grane.
Merge:
- Obično se koristi za spajanje dugotrajnih grana, na primer dev u main, ili za integraciju funkcionalnih grana u dev.
- Kreira commit spajanja koji jasno pokazuje kada je došlo do integracije promena iz drugih grana.
- Čuva celokupnu istoriju commit-ova, uključujući sve raskršće.
git checkout dev // Prebacivanje na ciljnu granu
git merge feature/nova-funkcija // Spajanje funkcionalne grane
Rebase:
- Koristi se za održavanje čiste i linearnog istorije commit-ova u funkcionalnim granama do njihove integracije (obično u dev).
- Prebacuje commit-ove trenutne grane na vrh ciljne grane (dev), efektivno "prepisujući" istoriju.
- Pojednostavljuje istoriju, izbegavajući commit-ove spajanja za svaku malu funkciju ili ispravku.
- Važno: Nikada ne radite rebase na javnim granama na kojima rade drugi programeri, jer to može izazvati konflikte pri povlačenju promena.
git checkout feature/nova-funkcija // Prebacivanje na funkcionalnu granu
git rebase dev // Prebacivanje commit-ova funkcionalne grane na vrh dev
// Ako je potrebno, rešavamo konflikte
git push --force-with-lease // Koristimo --force-with-lease za siguran push nakon rebase-a
Naš standardni radni tok:
- Nova funkcija ili ispravka se razvija u posebnoj grani (feature/..., fix/...).
- Periodično (pre pull request-a ili za sinhronizaciju sa dev-om) funkcionalna grana se rebase-uje na aktuelnu verziju dev-a. Ovo pomaže da se konflikti reše u ranoj fazi.
- Nakon završetka razvoja i pregleda koda, funkcionalna grana se spaja u
devsano-ff(non-fast-forward), da bi se sačuvale informacije o spajanju. Ili, ređe, se squash-uje u jedan commit pre spajanja udevza veoma male funkcije ili ispravke. - Iz
devse periodično prave verzije umain(produkcijska grana), uvek pomoću merge-a.
Na ovaj način, balansiramo očuvanje istorije commit-ova (merge) sa održavanjem čiste razvojne grane (rebase funkcionalnih grana).