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:

  1. 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