Pochemu Git takoy slozhnyy?


Git nikogda ne predpolagal, chtoby on kazalsya vam prostym.

Dumayete, Git — eto vsego lish’ add, commit, push? Eto znachit, chto vy vse vremya igrali v “odinochnom rezhime”, maksimum — po seti s drugom. Eto ne znachit ispol’zovat’ Git — eto ispol’zovat’ Git kak ruchnuyu sinkhronizatsiyu Baydu-oblachnogo diska.

Slozhnost’ Gita proistekayet iz predel’noy zadachi, dlya resheniya kotoroy on byl sozdan: kak gruppa programmistov, kotoryye ne doveryayut drug drugu, rabotayut v protivopolozhnoye vremya i mogut v lyuboy moment ischeznut’, mozhet sotrudnichat’ nad odnim proyektom, ne vyzyvaya khaos?

Vot smotrite, clone i push mozhet sdelat’ lyuboy. No kak tol’ko vy nachinayete rabotat’ v komande — vy delayete pull i vse v konfliktakh, ekran zavalivan <<<<< HEAD i >>>>>> kakoy-to-sluchaynyy-khesh — vot gde nachinayetsya koshmar.

Ya sam cherez eto proshol. Odin novyy backend-razrabotchik v nashey komande byl talantliv, no ne umeil obrashchat’sya s Gitom. Odnazhdy yemu nuzhno bylo sdelat’ srochnyy hotfix, on chasami ne mog etogo sdelat’ i prishol ko mne za pomoshch’yu. Ya posmotrel na yego graf vetok — Gospodi, eto bylo perepleteniye, dostoynoye shchupalets Ktulhu: razvetvleniya, sliyaniya, yeshcho razvetvleniya, yeshcho sliyaniya, v peremezhku s neskol’kimi bessmyslennymi kommitami merge branch 'master' into master. YA sprosil, chto on sdelal. On skazal: “YA ne mog sdelat’ pull, poetomu ya sdelal fetch, potom rebase, rebase ne srabotal, ya sdelal merge, merge vsyo yeshcho byl s konfliktami, poetomu ya sdelal reset…”

Moye davleniye podskochilo. On obrashchalsya s Gitom kak s kolodtsem zhelaniy — kakaya komanda zvuchala luchshe, tu on i brosal, nadeyas’, chto sila chuda sotvorit chudo. Spoyler: chuda ne proizoshlo, no my chut’ ne ustroili avariyu.

I eto tol’ko verkhushka aysberga. Glubzhe vy nakhodite “zapretnyye tekhniki” atomicheskoy manipulyatsii istoriyey: rebase -i, cherry-pick, filter-branch. Dlya chego oni? Prosto govorya, eto “mashina vremeni” mira koda — oni pozvolyayut vam vernut’sya v proshloye i izmenit’ istoriyu. No, kak my vse znayem iz fil’mov, devyat’ iz desyati puteshestvennikov vo vremeni razrushayut vselennuyu. git reflog — eto vashe lekarstvo ot sozhaleniya, no v bol’shinstve sluchayev vy dazhe ne znayete, kogda “otravilis’.”

Filosofiya dizayna Gita zaklyuchayetsya v tom, chto on ne doveryayet nikakomu tsentral’nomu avtoritetu. On schitayet komp’yuter kazhdogo razrabotchika polnoy “parallel’noy vselennoy” (repository). Kazhdyy sdelannyy vami commit sozdayet novyy istoricheskiy snimok v etoy vselennoy. Vetki pozvolyayut vam sozdavat’ beskonechnyye parallel’nyye vselennyye po zhelaniyu. Merge i rebase — eto popytki primirit’ dve raznyye “vremennyye linii” — predstav’te, naskol’ko eto slozhno. Dazhe fiziki etogo ne ponyali!

Oblast’ stadirovaniya sushchestvuyet, chtoby vy mogli tochno kontrolirovat’, chto popadayet v commit. Vetki izoliruyut vashu rabotu, chtoby vy ne meshali drugim. Merge obrabatyvayet neizbezhnyy produkt sotrudnichestva: razkhozhdeniye. Vse eto sluzhit odnoy velikoy “raspredelennoy” tseli. Git dayet vam beskonechnuyu svobodu — i beskonechnyye sposoby vse isportit’.

I vot vopros: beznaadezhen li Git? Mogut li obyknovennyye lyudi yego osvoit’?

Ne sovsem. Problema ne v Gite — a v tom, kak my yego izuchayem. Bol’shinstvo uchebnikov — eto libo slovarnyye spiski komand, libo fragmentarnyye ob“yasneniya stsenariyev. Ofitsial’naya dokumentatsiya — kak tysyachastranichnyy slovar’ Sin’khua — otlichno podkhodit dlya poiska slova, no nel’zya nauchit’sya pisat’ romany, chitaya slovar’. Onlayn-gaydy razbrosany povsyudu, kak gorchatka razobrannykh detaley Lego bez instruktsii, pokazyvayushchey, kak sobrat’ «Tysyacheletniy sokol».

Vot pochemu ya nastoyatel’no rekomenduyu uchebniki, kotoryye ne pytayutsya okhvatit’ vsyo, a sosredotachivayutsya na chastykh prakticheskikh stsenariyakh. YA schitayu, chto «Prakticheskoye rukovodstvo po Gitu s nulya do profi» ot komandy Bytedance — ochen’ khorosheye.

On ob“yasnyayet raznitsu mezhdu git pull i git pull --rebase i kogda ispol’zovat’ kazhdyy iz nikh, vmesto togo chtoby zastavlyat’ vas zazubrivat’. On provodit vas shag za shagom cherez real’nyy sluchay konflikta, pokazyvaya, kak reshit’ yego elegantno, a ne prosto udalit’ chuzhoy kod. On ob”yasnyayet, kogda vasha funktsional’naya vetka sil’no otstala ot osnovnoy, ispol’zovat’ merge ili rebase dlya sinkhronizatsii i kakovy plyusy i minusy kazhdogo vybora.

V konechnom schete, filosofiya Gita: «Dat’ vam beskonechnuyu svobodu, a takzhe dat’ vam verevku, chtoby povesit’sya». Khorosheye rukovodstvo uchit vas, kak ispol’zovat’ etu verevku, chtoby splesti set’ ili zabrat’sya na skalu — a ne sluchayno nakinut’ petlyu sebe na sheyu. Nasha tsel’ — ne stat’ Git-arkheologom, kotoryy mozhet naizust’ prochitat’ vse komandy. A stat’ Git-masterom, kotoryy uverenno dvizhetsya v komande, nikogda ne podvodit kolleg i mozhet spasti polozheniye, kogda eto deystvitel’no nuzhno.