GitGud: Prepisivanje grane drugom granom
Recimo da imamo slučaj gde je jedna grana toliko zastarela da nema smisla da se radi "merge". Ovo je realan primer koji može da se desi ako se recimo na master
grani nalazi V1 verzija naše aplikacije a na drugoj grani V2 verzija. Kada završimo V2 verziju logično je da ona bude aktivna i nalazi se na master grani.
Kako ovo eleganto uraditi pomoću gita?
Kao i uvek, tajna se krije duboko u dokumentaciji. Ako zagledamo malo dublje koje su opcije git merge
komande, možemo da vidimo da ima opcija za biranje strategije.
Ako pogledamo strategiju ours
videćemo da je to ono što nam treba.
This resolves any number of heads, but the resulting tree of the merge is always that of the current branch head, effectively ignoring all changes from all other branches. It is meant to be used to supersede old development history of side branches.
Što znači da će se sve izmene sa naše grane uzeti "na slepo" i preklopiće izmene sa osnovne grane. Pa da vidimo to u praksi:
- Prvo će da odemo na granu koju želimo da postane naš
master
git checkout v2
2. Zatim će da u v2
"merge"ujemo master
ali će da zadržimo sve naše izmene.
git merge -s ours master
Ako ne želimo da imamo "commit", možemo da prosledimo opciju --no-commit
.git merge -s ours --no-commit master
3. Vratimo se na master
granu
git checkout master
4. "Merge"ujemo v2
git merge v2
Ovim smo preklopili master
granu v2
granom. Istorija master
grane je zadržana.
Zbog loše dokumentacije ili lošeg formatiranja često dolazi do greške da developeri pomešaju git merge -s ours xyz
sa git merge -X ours xyz
. Ove dve stvari uopšte nisu iste. Ako malo bolje pogledamo dokumentaciju, možemo da vidimo da se prvo ours
nalazi ispod recursive
opcije i ta je to pod-opcija, iz tog razloga i ima -X