Git
Chapters ▾ 2nd Edition

3.1 Git да тармоқланиш - Тармоқланиш ҳақида икки оғиз сўз

Деярли барча талқинларни бошқариш тизимлари (ТБТлари) қайсидир шаклда бўлсада тармоқланишни қўллаб қувватлайди. Тармоқланишни қўллаган ҳолда сиз асосий яратиш чизиғидан бошқа чизиқга ўтиб асосий чизиқдаги ишга ҳалақит бермайсиз. Кўпгина ТБТ ларда тармоқни яратиш асосан каталогларни нусхалашни талаб этгани учун катта лойиҳалар учун кўп вақт олувчи жараён бўлади.

Баъзи бир одамлар, Git нинг тармоқланиш модели ҳақида гапиришганида, уни бошқа ТБТ лардан орқа фонда қолдирган ҳолатда ажратиб тургани учун “киллер-фичи” дея аташади. Унда шунчалик муҳим бўлган нима бор? Git тармоқланиш жуда енгил вазнлидир. Тармаоқни яратиш деярли ўша ондаёқ яратилади ва тармоқдан тармоққа ўтиб юришлар ҳам тез бажарилади. Кўпгина бошқа ТБТ лардан фарқли равишда Git бир кунда бир неча бор бирлаштириш ва тармоқланишлар амалга оширилиши сабабли иш жараёнини бироз кенгайтиради. Ушбу функционални тушуниш ва уни бошқара олиш сизга такрорланмас ва мустаҳкам бўлган ускуна сифатида сизга одат бўлиб қолган яратувчанлик жараёнини ўзгартириб юборади.

Тармоқланиш ҳақида икки оғиз сўз

Тармоқланиш механизмини тушуниш учун ортга қайтиб Git ни маълумотларни қандай сақлашини ўрганиш керак.

Иш бошланиши бўлимдагилар ёдингизда бўлса, Git маълумотларни ўзгаришлар кетма-кетлиги тарзида сақламйди у суръатлар (snapshot) тўпламини ишлатади.

Сиз фиксирлашни амалга ошираётган вақтингизда Git уни тайёрланган файллар суръатига (snapshot) мурожаат қиладиган кўрсаткични ўзида мужассамлаштирган объект тарзида сақлайди. Ушбу объект муаллифнинг номи, email и, ҳабари ва фиксирлашга тегишли кўрсаткич ёки ундан олдинги (унинг аждодлари) фиксирлашлар ҳақида маълумотларни ўзида мужассамлаштирган: биринчи сафарги фиксирлаш учун авлод фиксирлашлар бўлмайди, оддий фиксирлашга битта бош фиксирлаш ва тармоқларнинг бирлашишидан хосил бўлган фиксирлашда бир нечта бош фиксирлашлар.

Тасаввур қилинг файллар дарахтини ўзида сақловчи каталог мавжуд бўлсин, ва сиз уларни барчасини тайёрлаябсиз ва сўнгра уларни битта фиксирлаш тарзида сақлаябсиз. Тайёрлаш жараёнида ҳар бир файлнинг Git да файлларнинг талқини (Git уларга мурожаат қилади) ҳисобланмиш назорат йиғиндиси (Иш бошланиши дан билганимиздек у SHA-1) ҳисоблаб чиқилади сўнгра ушбу йиғиндилар тайёрланган файллар соҳасига қўшилади:

$ git add README test.rb LICENSE
$ git commit -m 'initial commit of my project'

Қачон сиз фиксирлашни git commit командаси билан яратар экансиз, Git ҳар бир қисм каталогларни (бизнинг мисолимизда лойиҳанинг фақат бош каталогини) назорат йиғиндисини ҳисоблаб чиқади ва ушбу объектлар дарахтини омборга сақлайди. Сўнгра Git фиксирлаш объектини метамаълумот ва лойиҳанинг асосий дарахтига мурожаат қилувчи кўрсаткич билан яратади. Бундай қилинишига сабаб у зарурат туғилганда ушбу суръатни (snapshot) яратиш имконини яратишдир.

Сизнинг Git омборингиз энди бешта объектни сақлайди: ҳар бир файлнинг ташкил этувчилари учун блоб (blob), сақланган файллар блобларига кўрсатувчи кўрсаткичлари билан бирга каталогнинг ташкил этувчиларини дарахтсимон кўриниш, асосий дарахтга мурожаат қилувчи кўрсаткичли фиксирлашнинг ўзи, фиксирлашнинг метамаълумотлари.

Фиксирлаш ва унинг дарахти.
Figure 9. Фиксирлаш ва унинг дарахти

Агар сиз ўзгартириш киритсангиз ва яна фиксирлашни бажарсангиз у ҳолда навбатдаги фиксирлаш ўзидан олдинги фиксирлашга кўрсатувчи кўрсаткични сақлайди.

Фиксирлаш ва унинг бошлари.
Figure 10. Фиксирлаш ва унинг бошлари

Git да тармоқ (branch) бу — енгилгина ана шу фиксирлашлардан бирига кўчувчи кўрсаткич. Git да асосий тармоқнинг номи одатда — master.

Сиз қачон фиксирлашларни бажарар экансиз сиз охирги фиксирлашга кўрсатувчи асосий тармоқни оласиз. Ҳар бир фиксирлаш автоматик тарзда ушбу кўрсаткични олдинга томон суради.

Note

“master” тармоғи бу Git даги — махсус тармоқ эмас. Уни ҳамма тармоқлардан фарқли жойи йўқ. Унинг деярли ҳамма омборда мавжудлигига сабаб уни git init командаси яратади ва кўпчилик одамлар уни номини ўзгартиришмайди.

Тармоқ ва фиксирлашлар тарихи.
Figure 11. Тармоқ ва фиксирлашлар тарихи

Янги тармоқ яратиш

Сиз тармоқ яратган вақтингизда айнан нима содир бўлади? Кейинчалик силжитиш учун янги кўрсаткич яратилади. Айтайлик сиз “testing” номли янги тармоқ яратмоқчисиз. Сиз буни ушбу git branch командаси орқали қилишингиз мумкин:

$ git branch testing

Натижада сиз турган фиксирлашга кўрсатувчи янги кўрсаткич яратилади.

Икки тармоқ битта фиксирлашлар кетма-кетлигига кўрсатаябди.
Figure 12. Икки тармоқ битта фиксирлашлар кетма-кетлигига кўрсатаябди

Git сизни қайси тармоқдалигингизни қандай қилиб аниқлайди? У махсус HEAD номли кўрсаткични сақлайди. Шуни назарда тутингки Git да HEAD тушунчаси бошқа авваллари балки сиз ишлатган (Subversion ёки CVS) талқинларни бошқариш тизимидагиларга қараганда анчагина фарқ қилади. Git да бу сиз турган маҳаллий тармоққа кўрсатувчи кўрсаткич. Бизнинг мисолимизда биз ҳоли “master” тармоғида турибмиз. git branch командаси фақат янги тармоқ яратади. Унга щтиш бажарилмайди.

HEAD кўрсаткичи тармоққа кўрсатаябди.
Figure 13. HEAD кўрсаткичи тармоққа кўрсатаябди

Сиз буни git log командаси ёрдамида онсонлик билан кўришингиз мумкин. У сизга тармоқлар кўрсаткичлари қаерга кўрсатаётганини кўрсатади. Ушшбу опция --decorate дейилади.

$ git log --oneline --decorate
f30ab (HEAD, master, testing) add feature #32 - ability to add new
34ac2 fixed bug #1328 - stack overflow under certain conditions
98ca9 initial commit of my project

f30ab фиксирлашга кўрсатувчи “master” ва “testing” тармоқлари кўриниб турибди.

Тармоқларга уланиш

Мавжуд тармоққа уланиш учун git checkout командасини беринг. Келинг “testing” тармоғига уланамиз:

$ git checkout testing

Натижада HEAD кўрсаткичи testing тармоғига кўрсатишни бошлайди.

HEAD кўрсаткичи жорий тармоққа кўрсатаябди.
Figure 14. HEAD кўрсаткичи жорий тармоққа кўрсатаябди

Бунда қандай маъно бор? Келинг яна битта фиксирлашни бажарамиз:

$ vim test.rb
$ git commit -a -m 'made a change'
HEAD тармоқ кўрсаткичи олдинга силжиди.
Figure 15. HEAD тармоқ кўрсаткичи олдинга силжиди

Бу қизиқ, чунки сизни “testing” тармоғингизга кўрсатувчи кўрсаткич олдинга силжиди лекин “master” тармоғи ҳали ҳам аввалги git checkout командаси берилиш вақтидаги фиксирлашга кўрсатаябди. Келинг “master” тармоғига уланамиз:

$ git checkout master
HEAD кўрсаткичи силжиди
Figure 16. HEAD кўрсаткичи силжиди, сиз checkout қилдингиз

Ушбу команда иккита нарсани қилди. У HEAD кўрсаткичини ортга “master” тармоғига силжитди ва ишчи каталогидаги файлларни тармоқ кўрсатаётган суръатдаги(snapshot) сақланган ҳолатга қайтарди. Бу яна бундан буёғига киритилган ўзгаришлар лойиҳанинг эски талқинига тегишли бўлишини англатади. Бошқа сўзлар билан айтганда “testing” тармоғида бажарилган барча ишлар ортга қайтарилди, бироқ сиз бошқа йўналишда давом этишингиз мумкин.

Note
Тармоқларга уланиш ишчи каталогидаги файлларни ўзгартиради

Ёдда тутиш муҳимки, сиз Git да тармоқларга уланаётган вақтингизда ишчи каталогидаги файллар ўзгаради. Агар сиз эски тармоққа уланаётган бўлсангиз унда ишчи каталог кўриниши ана шу тармоқнинг охирги фиксирлаш ҳолатидаги кўринишида бўлади. Агар Git қайсидир сабабга кўра буни қила олмаса у сизга тармоққа уланишга қўймайди.

Келинг яна бир қанча ўзгаришлар киритамиз ва навбатдаги фиксирлашни бажарамиз:

$ vim test.rb
$ git commit -a -m 'made other changes'

Энди сизни лойиҳангиз тарихи бўлинди (Тармоқланган тарих га қаранг). Сиз тармоқ яратдингиз, унга уландингиз, унда ишладингиз, сўнг асосий тармоққа қайтдингиз ва унда ишладингиз. Ушбу ўзгаришлар бир-биридан изоляцияланган: сиз ундан бунга бемалол ўтишингиз мумкин ва қачон тайёр бўлса уларни биргаликда бирлаштиришингиз мумкин. Ва буларнинг барчаси оддийгина командалар орқали бажарилади: branch, checkout ва commit.

Тармоқланган тарих.
Figure 17. Тармоқланган тарих

Бунинг ҳаммасини git log командаси орқали кўришингиз мумкин. git log --oneline --decorate --graph --all командаси фиксирлашлар тарихини, тармоқларингиз кўрсаткичлари қаерга кўрсатаябди ва лойиҳа тарихи қандай тармоқланганлигини кўрсатади.

$ git log --oneline --decorate --graph --all
* c2b9e (HEAD, master) made other changes
| * 87ab2 (testing) made a change
|/
* f30ab add feature #32 - ability to add new formats to the
* 34ac2 fixed bug #1328 - stack overflow under certain conditions
* 98ca9 initial commit of my project

Тармоқни ўчириш ва яратиш умуман кўп вақтни олмайдиган иш бўлиб, Git да тармоқ — бу у кўрсатаётган фиксирлашнинг 40 та белгили SHA-1 назорат йиғиндисини ўзида ташкил этувчи оддийгина файл. Янги тармоқни яратиш ва ўчириш жуда онсон бўлиб бу - файлга 41 байтни ёзиш дегани (40 белги ва сатрга ўтиш).

Git даги бундай тармоқланиш бошқа эски талқинларни бошқариш тизимларидаги лойиҳани барча файлларини бошқа қисм каталогга кўчиришни амалга оирувчи тармоқланишидан фарқ қилади. У ерда доим лойиҳани тармоқланиши бир неча секунддан бир неча минутгача вақт олиши мумкин. Git да тармоқланиш шу ондаёқ бажарилади. Шунингдек, фиксирлаш жараёнида биз бош фиксирлашга кўрсаткични сақлар эканмиз, бирлаштириш учун мос келувчи асосни топиб олиш жуда онсон ва бу биз учун автоматик тарзда бажарилади. Ушбу имкониятлар тез-тез тармоқларни яратиб ва қўллаш учун илҳом яратади.

Келинг сизга ҳам буни нима учун қилишингиз кераклигини кўрамиз.