Git
Chapters ▾ 2nd Edition

3.5 Git да тармоқланиш - Узоқ масофадаги тармоқлар

Узоқ масофадаги тармоқлар

Узоқ масофадаги тармоқлар — бу сизни узоқ масофадаги омборларингиз ҳолатларига мурожаатлар (pointers). Булар силжитиб бўлмайдиган маҳаллий тармоқлар; улар ҳар доим тармоқ билан алоқа ўрнатган вақтингизда автоматик силжийди. Узоқ масофадаги тармоқлар уларга охирги бор боғланиш бўлганда улар қаерда жойлашганлигини эслатиб турувчи маҳкамланган белгилашлар каби ҳаракат қилади.

Улар (узоқ. мас. омбор номи )/(тармоқ) каби кўринади. Масалан, агар сиз origin серверидаги master тармоғи охирги бор уланиш вақтида қандай кўринишда бўлганлигини кўрмоқчи бўлсангиз origin/master тармоғини текширинг. Агар сиз шеригингиз билан бир муаммо устида ишлаган бўлсангиз ва у iss53 тармоғини жойлаштирган бўлса бу вақтда сизда iss53 маҳаллий тармоғингиз бор бўлиши мумкин бироқ у сервердаги тармоқ origin/iss53 нинг фиксирлашига кўрсатади.

Буларни ҳаммаси бизни чалкаштирмаслиги учун кеоинг мисол кўрамиз. Айтайлик сизда компьютер тармоғида git.ourcompany.com ном билан чақирилувчи ўзингизни Git-серверингиз бор. Агар сиз ундан ниманидир клонласангиз Git нинг clone командаси автоматик тарзда уни origin дея номлаб, ундан барча маълумотларни олади, у ёқда master тармоғи кўрсатаётган кўрсаткич учун янги кўрсаткич яратади ва уни маҳаллий жойда origin/master дея номлайди. Git шунигдек, сизни ўз master тармоғингизни яратади. У origin серверидаги master тармоғи келган жойдан бошланади. Шу туфайли сизни нима биландир шуғулланишингизга имкониятингиз бўлади.

Note
“origin” — бу махсус ном эмас

“origin” номи ва унга ўхшаб тармоқнинг номи “master” ҳам Git учун ҳеч қандай маъно англатмайди. Шу дамда “master” — бу git init командасини ишга туширсангиз манба тармоғига одатда бериладиган ном, фақат биргина сабаб туфайли “origin” - бу git clone командасини ишга туширганингизаги узоқ масофадаги тармоқга бериладиган ном. Агар сиз git clone -o booyah командасини ишга туширсангиз, сиз узоқ масофадаги тармоқ учун одатий ном сифатида booyah/master ни назарда тутган бўласиз.

Клонлашдан сўнг сервер ва маҳаллий омборлар.
Figure 30. Клонлашдан сўнг сервер ва маҳаллий омборлар

Агар сиз ўзингизни маҳаллий тармоғингизда нимадир қилсангиз ва шу вақт оралиғида кимдир ўзгаришларни git.ourcompany.com га ташлаб master тармоқни янгилаган бўлса у ҳолда сизларнинг тарихларингиз турли давом этади. Яна сиз токи origin тармоқ билан боғланмас экансиз сизни origin/master кўрсаткичингиз силжимай тураверади.

Маҳаллий ва узоқ масофадаги иш ажралиб кетиши мумкин.
Figure 31. Маҳаллий ва узоқ масофадаги иш ажралиб кетиши мумкин

Сизни ишингиз синхронизация қилиб туриши учун git fetch origin командаси бажарилади. Ушбу команда “origin” қайси серверга мослигини излайди (бизнинг мисолимизда бу git.ourcompany.com); у ердан сизда мавжуд бўлмаган барча маълумотларни олиб сизни маҳаллий омборингизни янгилайди. origin/master кўрсаткичини янги ўринга силжитади.

`git fetch` сизнинг узоқ масофадаги гипер мурожаатларингизни ўзгартиради.
Figure 32. git fetch сизнинг узоқ масофадаги гипер мурожаатларингизни ўзгартиради

Бир қанча узоқ масофадаги серверлардаги узоқ масофадаги тармоқларни қандай бўлишини кўриб чиқиш учун тасаввур қиламиз сизда яна битта фақатгина маълум бир яратувчилар гуруҳи ишлай оладиган ички Git-сервер бор. Ушбу сервер git.team1.ourcompany.com да жойлашган. Сиз уни хозир ишлаб турган лойиҳангизга янги узоқ масофа мурожаати тарзида Git асослари да ёзилганидек git remote add командаси ёрдамида қўшишингиз мумкин. Ушбу узоқ масофадаги серверга teamone дея ном беринг. Ушбу ном тўлиқ URL учун қисқа ном бўлади.

Узоқ масофадаги тармоқ тарзида янги серверни қўшиш.
Figure 33. Узоқ масофадаги тармоқ тарзида янги серверни қўшиш

Энди серверда бору лекин сизда бўлмаган барча маълумотларни олиш учун git fetch teamone командасини беришингиз керак. Айни дамда ушбу серверда origin серверида мавжуд бўлган фақат маълум бир қисм маълумотлар бўлгани боис Git ҳеч қандай маълумот олмайди бироқ узоқ масофадаги teamone серверидаги master тармоқдаги фиксирлаш кўрсаткичига мос тармоқни teamone/master номи билан қўяди.

`teamone/master` тармоғини кзоқ масофадан кузатиш.
Figure 34. teamone/master тармоғини кзоқ масофадан кузатиш

Ўзгаришларни жўнатиш

Қачон сиз тармоқни атрофдагиларга улашмоқчи бўлсангиз сиз уни ёзишга руҳсатингиз мавжуд бўлган серверга жўнатишингиз (push) керак бўлади. Сизнинг маҳаллий тармоқларингиз автоматик тарзда узоқ масофадаги серверлар билан бир хиллик алмашинувини амалга оширмайди. Сиз айнан қайси тармоқни улашмоқчи бўлсангиз ўшаларни аниқ кўрсатиб жўнатишингиз керак бўлади. Шу тарзда сиз бошқаларга кўрсатишни хоҳламаган ўзингизни тармоқларингизни иш учун қўллашингиз ва бошқалар билан биргаликда ишлашингиз мумкин бўлган маълум бир мавзули тармоқларингизни жўнатишингиз мумкин.

Агар сизда бошқалар билан ишлашни хоҳлаган serverfix тармоқ мавжуд бўлса сиз уни биринчи жўнатган тармоғингиз каби жўнатишингиз мумкин бўлади. git push (узоқ мас. сервер) (тармоқ):

$ git push origin serverfix
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
 * [new branch]      serverfix -> serverfix

Бу қандайдир маънода қисқартириш. Git автоматик тарзда serverfix тармоқ номини refs/heads/serverfix:refs/heads/serverfix га алмаштиради, бу эса “менинг маҳаллий serverfix тармоғимни ол ва унга узоқ масофадаги serverfix тармоғини янгила.” Биз бўлимни refs/heads/ билан Git Internals да батафсилроқ таҳлил қиламиз, бироқ уни ўтказиб юбориш ҳам мумкин. Сиз шунингдек git push origin serverfix:serverfix ни бажаришингиз мумкин — унда ҳам ўша жараён бўлади, бу эса “менинг serverfix имни ол ва уни узоқ масофадаги serverfix га айлантир.” дегани. Ушбу форматни маҳаллий тармоқни узоқ масофадаги тармоқга бошқа ном билан жўнатиш учун ишлатилади. Агар сиз тармоқни узоқ масофада serverfix дея номланиши хоҳламасангиз у ҳолда бундан аввалги команда ўрнига git push origin serverfix:awesomebranch ни бажаринг. Шундай қилиб сизни serverfix маҳаллий тармоғингиз узоқ масофадаги лойиҳа awesomebranch тармоғига жўнатилади.

Note
Ҳар сафар ўз махфий кодингизни (паролингизни) киритманг

Агар сиз ўзгаришларни жўнатиш учун HTTPS URL ни ишлатаётган бўлсангиз Git-сервер ҳуқуқни текшириш учун фойдаланувчи номи ва махфий кодини сўрайди. Одатда сизга ўзгаришларни жўнатишга руҳсат берилганлигини айтиш учун ушбу маълумотни терминалда киритишни тавсия қилади.

Агар сиз ҳар сафар ўзгаришларни юбораётганда ўз маълумотларингизни қайтадан киритишни хоҳламасангиз сиз “рўйҳатга олинган маълумотларни кешини” ўрнатишингиз мумкин. Онсони уларни хотирада бир неча дақиқа ушлаб туриш. Сиз git config --global credential.helper cache командаси ёрдамида онсонлик билан созлашингиз мумкин бўлади.

Рўйҳатга олинган маълумотларни кешлашни вариантлари ҳақида янада батафсилроқ маълумотларни олиш учун Credential Storage бўлимга қарашингиз мумкин.

Кейинги сафар сизни ҳаммуаллифингиз сервердан янгиланишларни олса у сервердаги serverfix ни узоқ масофадаги origin/serverfix тармоғи сифатида нимага кўрсатаётган бўлса шуни олади:

$ git fetch origin
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/schacon/simplegit
 * [new branch]      serverfix    -> origin/serverfix

Шуни белилаб қўйиш керакки, маълумотларни олиш вақтида сизда янги узоқ масофа тармоқлари пайдо бўлади. Сиз улар учун автоматик тарзда ўзгартириш мумкин бўлган нусхани олмайсиз. Бошқа сўзлар билан ифодаласак, бизнинг мисолда сиз янги serverfix тармоғини олмайсиз фақат ўзгартира олмайдиган origin/serverfix кўрсаткични оласиз.

Ушбу ишларни ўзингизни жорий ишчи тармоғингизга бирлаштириш учун git merge origin/serverfix командасини беринг. Агар сизга ўзингизни ишлашингиз мумкин бўлган шахсий serverfix тармоғингиз керак бўлса у ҳолда сиз уни узоқ масофадаги тармоқ асосида яратишингиз мумкин:

$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

Бу сизга ишлашингиз мумкин бўлган маҳаллий тармоқни беради. У origin/serverfix қаерга келган бўлса шу ердан бошланади.

Тармоқларни кузатиш

Маҳаллий тармаоқни узоқ масофадаги тармоқдан олиш “кузатилувчи тармоқ” (ёки баъзида “upstream branch”) дея аталувчи тармоқни яратади. Кузатилувчи тармоқлар — бу узоқ масофадаги тармоқлар билан тўғридан тўғри боғланган маҳаллий тармоқлар. Агар сиз кузатилувчи тармоқда туриб git pull командасини берсангиз Git қайси узоқ масофадаги сервердан барча мурожаатларни олиш кераклигини билади ва мос узоқ масофадаги тармоқ билан бирлаштиришни амалга оширади.

Омборни клонлаштириш мобайнида origin/master ни кузатувчи master тармоғи автоматик тарзда яратилади. Бироқ, сиз бошқа кузатувчи тармоқларни ҳам созлаб қўйишингиз мумкин. Айтайлик, агар сиз тармоқларнинг ҳаммаси бошқа узоқ масофадаги омбордагиларни кузатишини хоҳлайсиз ёки master тармоғини кузатишни хоҳламайсиз. Оддий мисол, сиз хозиргина буни қандай қилишни кўрдингиз git checkout -b [тармоқ] [узоқ мас. сервер]/[тармоқ]. git тақдим этувчи умумий қабул қилинган амаллар мавжуд бўлиб у қуйида --track опцияси билан берилиши келтирилган:

$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

Маҳаллий тармоқни узоқ масофадаги тармоқдан фарқли равишда бошқа ном билан созлаш учун сиз биринчи талқинни маҳаллий тармоқнинг бошқа номи билан онсонгина ишлатишингиз мумкин:

$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'

Энди сизни sf маҳаллий тармоғингиз origin/serverfix дан ўзгаришларни автоматик тарзда олиб(pull) туради.

Агар сизда маҳаллий тармоқ мавжуд бўлса ва уни хозиргина олган узоқ масофадаги тармоққа созламоқчи бўлсангиз ёки сиз кузатаётган upstream-тармоқни ўзгартирмоқчи бўлсангиз у ҳолда сиз ихтиёрий вақтда уни аниқ кўрсатиб ўрнатиш учун -u ёки --set-upstream-to калитлари билан биргаликда git branch командасини ишлатишингиз мумкин.

$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Note
Upstream нинг қисқартмаси

Агар сизда кузатилаётган ўрнатилган тармоқ мавжуд бўлса сиз унга @{upstream} ёки унинг қисқартмаси бўлмиш @{u} орқали мурожаат қилишингиз мумкин. Хуллас, агар сиз master тармоғида турган бўлсангиз ва origin/master кузатилаётган бўлса, сиз истасангиз git merge @{u} га ўхшаш командани git merge origin/master командаси ўрнига чақиришингиз мумкин.

Агар сиз ўзингизда кузатилаётган қандай тармоқлар ўрнатилганини кўрмоқчи бўлсангиз, сиз git branch командасида -vv опциясидан фойдаланишингиз мумкин. Сизнинг маҳаллий тармоқларингиз қўшимча маълумотлар билан кўрсатилади. Ушбу маълумотлар ўз ичида маҳаллий тармоқларнинг қайси бири кузатилаётганлигини, маҳаллий тармоқларда қанча фиксирлашлар бўлган ва улардан қанчаси серверга жўнатилмаган ёки жўнатилсада серверга қуйилмаган ёки асосий тармоқ мос равишда тенглик хосил қилинганлигини кўрсатади.

$ git branch -vv
  iss53     7e424c3 [origin/iss53: ahead 2] forgot the brackets
  master    1ae2a45 [origin/master] deploying index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
  testing   5ea463a trying something new

Шундай қилиб бу ерда биз кўришимиз мумкинки, iss53 тармоқ origin/iss53 ни кузатаябди ва у 2 та ўзгаришга олдиндалигини яъни биз серверга юборилмаган 2 та фиксирлашга эгалигимизни англатади. Сиз шунингдек, master тармоқнинг origin/master ни кузатишини ва у бутун ўзгаришсиз ҳолатда эканлигини кўришингиз мумкин. Сўнгра биз serverfix тармоқнинг бизнинг teamone сервердаги server-fix-good тармоқни кузатаётганини ва 3 та фиксирлашга олдиндалигини кўришимиз мумкин. Бу фиксирлашлардан 1 таси серверда бўлиб у ҳали бирлаштирилмаганлигини ва 2 та фиксирлаш серверга жўнитилмаганлигидан дарак беради. Охирида биз testing тармоғимиз узоқ масофадаги тармоқни кузатаётганини кўришимиз мумкин.

Муҳим жиҳати шундаки, ушбу рақамлар - сервердан охирги бор олинган сонларни ифодалайди. Ушбу команда серверга мурожаат қилмайди балки у маҳаллий кешдаги сервер ҳақидаги маълумотдан фойдаланиб кўрсатади. Агар сиз бутунлай етакчи, ортда қолган фиксирлашларни кўрмоқчи бўлсангиз ушбу командадан олдин сиз барча узоқ масофадаги серверларингиздан маълумотларни тортиб олишингиз керак бўлади. Сиз мана бунга ўхшаш ниманидир қилишингиз мумкин бўлади: $ git fetch --all; git branch -vv

Ўзгаришларни қабул қилиш

git fetch командаси сервердан барча ўзгаришларни олади бироқ сизни ишчи каталогингизни ўзгартирмайди. Ушбу команда сиз учун фақатгина маълумотларни тақдим этади ва сизни мустақил бирлаштиришларни амалга оширишингизга йўл қўйиб беради. Бундан ташқари git pull номли команда ҳам мавжуд, у кўпинча git fetch ва командаларининг бирин кетин берилганига тенг бўлади. Агар сизда бундан олдинги бўлимда кўрсатилганидек кузатилувчи тармоқ мавжуд бўлса, ёки у аниқ ўрнатилган бўлса, ёки у clone ёки checkout командалари шарофати билан яратилган бўлса git pull командаси сервер ва сизнинг жорий тармоғингиз кузатилаётганини кўради, сервердан маълумотларни олади ва сўнгра узоқ масофадаги тармоққа бирлаштиришга уриниб кўради.

Одатда fetch ва merge командаларини ўзларини ишлатган афзал. Чунки git pull командаси бажарилиши узилиб қолиши мумкин.

Узоқ масофадаги серверда тармоқларни ўчириш

Айтайлик сиз ва сизни ҳаммуаллифларингиз янги киришни тугатишди ва уни узоқ масофадаги master (ёки кодни бир моромда сақланадиган бошқа бир тармоққа) тармоғига бирлаштирдиларингиз. Сиз узоқ масофадаги сервердан git push командаси билан --delete калитини қўшиб ишлатиб тармоқни ўчиришингиз мумкин. Агар сиз сервердан serverfix тармоқни ўчирмоқчи бўлсангиз қуйидагини бажаринг:

$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
 - [deleted]         serverfix

Умуман олганда ушбу сатр сервердаги кўрсаткични ўчиради. Қоидага асосан, Git-сервер токи чиқиндиларни йиғиштирувчи ишга тушмагунча маълумотларни маълум бир муддатга қолдириб туради. Агар тармоқ беҳосдан ўчирилиб кетган бўлса, уни қайта тиклаш онсон.