Kada otvorite pull request, vaš kod je već prešao put: od izmene u editoru, preko commit-a u lokalnoj istoriji, do push-a koji ga deli sa svima ostalima. Taj put je najčešće nevidljiv. Ali kada dve osobe promene isti red, git staje i traži od vas da to razrešite.

Gde se izmena zapravo nalazi

Git čuva vaš rad na nekoliko odvojenih mesta. Vaša radna kopija je fajl onakav kakvim ga menjate. git add kopira izmenu u staging area. git commit pravi njen snimak u vašoj lokalnoj istoriji. Tek git push šalje vaše commit-ove na remote, odakle ih kolega može preuzeti sa git pull.

  1. 01Radna kopija
  2. 02Staging area
  3. 03Lokalna istorija
  4. 04Remote
  5. 05Pull kolege
Put jedne izmene. Konflikt nastaje kada pull ne može da spoji dva commit-a.

Kako git vidi izmenu

Git čuva istoriju kao snimke, ali kada poredi dva snimka, razmišlja red po red. Redovi prisutni u obe verzije su sidra; nizovi između sidara su izmene. Pronalaženje najduže zajedničke podsekvence redova je ono što diff održava stabilnim čak i kada se izmene gomilaju oko njega.

Zašto je to konflikt: merge base

Grana je pokretni pokazivač na commit. Kada dve osobe naprave granu od istog commit-a, njihovog merge base-a, i nastave da menjaju kod, njihove istorije se razilaze. Git uvek razmišlja u odnosu na tu osnovu. Ako je samo jedna strana promenila neki deo, git prihvata tu izmenu. Konflikt nastaje samo kada su obe strane promenile iste redove na različite načine.

<<<<<<< ours
owner: ana
=======
owner: marko
>>>>>>> theirs
Git ne može da zna kog vlasnika ste mislili, pa upisuje markere i prepušta odluku vama.

Rešavanje: trostrano spajanje

Rešenje je da istovremeno pogledate sve tri verzije (zajedničku osnovu, našu i njihovu) i rešavate jedan po jedan deo. Upravo to radi MergeForge: alat za rešavanje konflikata u tri panela za VS Code i Cursor, sa našom verzijom levo, njihovom desno i spojenim rezultatom u sredini.

  • Apply all non-conflicting preuzima svaku izmenu koju je napravila samo jedna strana, kako biste pažnju posvetili stvarnim konfliktima.
  • » / « bira stranu za jedan konfliktni deo; rezultat se odmah ponovo sastavlja.
  • Magic Resolve kombinuje čista dodavanja iz obe grane, a stvarna preklapanja sa obe strane ostavlja vama.

U pozadini je pravo diff3 trostrano spajanje, iz iste porodice algoritama koju koristi git, testirano na izlazu komande git merge-file sve do razlike CRLF i LF, byte-order oznaka i razmaka na kraju reda. Kada konflikt zahteva procenu, opcioni AI asistent može da ga objasni ili da predloži rešenje kao delove koje možete da pregledate, nikada kao tiho prepisivanje.

MergeForge je dostupan za VS Code i Cursor. Linkove za instalaciju pronađite na stranici proizvoda, a izvorni kod i testove na GitHub-u (otvara se u novoj kartici).