Git
Chapters ▾ 2nd Edition

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

Узоқ масофадаги омборлар билан ишлаш

Қайсидир Git – лойиҳа билан ҳамкорликда ишлаш учун узоқ масофадаги омборни қандай бошқариш кераклигини билиш зарур. Узоқ масофадаги омборлар – бу интернетда ёки яна тармоқда қаердадир сақланадиган лойиҳанинг ўзгаришлари. Улар бир қанча бўлиши ва қоидага биноан уларнинг ҳар бири сизга ё фақат ўқиш ё ўқиш ва ёзиш имкони билан берилиши мумкин. Ҳамкорликда ишлаш узоқ масофадаги омборни бошқаришни, маълумотлар алмашинуви керак бўлганда унга маълумот юбориш (push) ва ундан маълумот қабул қилишни (pull) ўз ичига олади. Узоқ масофадаги омборларни бошқариш узоқ масофадаги омборларни қўшишни, улардан амалда қўлланилмайдиганларини ўчиришни, турли хил узоқ масофадаги тармоқланишларни бошқаришни билиш ва уларни кузатилувчилар (tracked) тарзида ажратишни ёки ажратмасликни ва бошқа шу каби амалларни қамраб олган. Ушбу бўлим узоқ масофадаги омборни бошқариш юзасидан барча санаб ўтилган малакаларни ёритади.

Узоқ масофадаги омборларингизни намойиш қилиш

Қайси узоқ масофадаги серверлар сизда созланганлигини кўришни истасангиз git remote командасини бажариш талаб этилади. У изоҳлари киритилган узоқ масофадагилар учун қисқа номлар рўйҳатини чиқаради. Агар сиз ўз омбрингизни клонлаган бўлсангиз сизда охир оқибат origin кўриниши керак. Бу ном одатий ном бўлиб, уни сиз омборни клон қилган серверга Git нинг ўзи бириктиради:

$ git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin

Қайси URL га Git да қисқа ном мос келишини кўриш учун командада -v опциясини кўрсатиш мумкин:

$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)

Агар узоқ масофадаги омборлар сизда бирдан зиёд бўлса, команда уларни барчасини кўрсатади. Масалан, Grit омбори қуйидаги тарзда кўринади.

$ cd grit
$ git remote -v
bakkdoor  https://github.com/bakkdoor/grit (fetch)
bakkdoor  https://github.com/bakkdoor/grit (push)
cho45     https://github.com/cho45/grit (fetch)
cho45     https://github.com/cho45/grit (push)
defunkt   https://github.com/defunkt/grit (fetch)
defunkt   https://github.com/defunkt/grit (push)
koke      git://github.com/koke/grit.git (fetch)
koke      git://github.com/koke/grit.git (push)
origin    git@github.com:mojombo/grit.git (fetch)
origin    git@github.com:mojombo/grit.git (push)

Бу ушбу фойдаланувчиларнинг ихтиёрийсидан онсонгина ўзгаришларни қабул қилишимиз мумкинлигини билдиради. Биз қўшимча тарзида бир ёки ундан кўпларига push командасини ишлатишига ҳуқуқ беришимиз мумкин. Бироқ биз бу ҳақда бу ерда гаплашмаймиз.

Айтиш жоизки ушбу узоқ масофадаги омборлар турли хил протоколлардан фойдаланаябди; Биз булар ҳақида батафсилроқ маълумотларни Getting Git on a Server да берамиз.

Узоқ масофадаги омборларни қўшиш

Бундан олдинги бўлимларда мен узоқ масофадаги омборларни қўшишни озгина намойиш ҳам қилгандим энди уни батафсилроқ кўриб чиқамиз. Узоқ масофадаги Git – омборни қўшиш ва мурожатда онсон бўлишига қисқа ном билан қўшиш учун git remote add [қисқа_ном] [url] ни бажаринг:

$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)
pb	https://github.com/paulboone/ticgit (fetch)
pb	https://github.com/paulboone/ticgit (push)

Энди сиз командалар сатрида тўлиқ URL ўрнига pb номини ишлатишингиз мумкин. Масалан, сизда мавжуд бўлмаган Павлнинг омборидаги барча маълумотларни чиқариб олишни (fetch) хоҳласангиз git fetch pb командасини беришингиз мумкин:

$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit
 * [new branch]      master     -> pb/master
 * [new branch]      ticgit     -> pb/ticgit

Павлнинг master тармоғи энди маҳаллийда pb/master каби жойлашган. Сиз уни текширмоқчи бўсангиз ушбу тармоққа ўтишингиз ёки ўзингизни тармоқларингиздан бири билан бирлаштиришингиз (merge) мумкин. (Биз тармоқлар нима уларни қандай ишлатиш мумкин ва улар ҳақдаги батафсил маълумотларни Git да тармоқланиш да кўриб ўтамиз.)

Сизнинг узоқ масофадаги омборларингиз устида Fetch ва Pull командаларини бажариш

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

$ git fetch [remote-name]

Ушбу команда кўрсатилган узоқ масофадаги лойиҳа билан боғланади ва у лойиҳадан сизда ҳали йўқ бўлган барча маълумотларни олади. Командани бажарганингиздан кейин сизда ушбу узоқ масофадаги лойиҳадан барча тармоқларга мурожатлар пайдо бўлиши керак. Энди ушбу тармоқлар ихтиёрий вақт кўрилиши ёки бирлаштирилиши мумкин.

Сиз омборни клонлаштирган вақтингизда clone командаси автоматик тарзда ушбу узоқ масофадаги омборни “origin” номи билан қўшиб қўяди. Шу тарзда git fetch origin командаси барча қилинган ишларнинг серверга жўнатилганларини(push) сиз клонлаштирганингиздан сўнг (ёки fetch ёрдамида ўзгаришлар олинганда) тортиб олади. Таъкидлаш муҳимки, git fetch командаси маълумотларни сизни маҳаллий омборингизга олади, лекин уларни сиз қилиб турган ишингиз устига ташламайди ва уларни ўзгартирмайди. Сиз бу маълумотларни ўз маълумотларингиз билан бирлаштиришингиз учун сиз шунга тайёр бўлган вақтингизда ўз қўлингиз билан бажаришингиз керак бўлади.

Агар сизда узоқ масофадаги тармоқни қўшимча маълумот учун навбатдаги бўлим ва Git да тармоқланиш га қаранг) кузатувчи тармоқ бўлса унда сиз git pull командасини ишлатишингиз мумкин. Ушбу услуб сиз учун анча онсон ва анча қулай бўлиши мумкин. Шунингдек, git clone командаси одатда, ўзгаришсиз ҳолатда сизни маҳаллий master тармоғингизни сиз клонлаштирган узоқ масофадаги master тармоғини кузатишга созлаб қўяди (узоқ масофадаги омборда master тармоғи бор дея фараз қилинмоқда). git pull командасини ишлатиш, қоидага асосан сервердан маълумотларни юклаб олади ва уларни айни дамда сиз ишлаб турган код билан бирлаштиришга (merge) ҳаракат қилади.

Сизнинг узоқ масофадаги омборларингизга Push командасини ишлатиш

Қачон сиз ўзингизни қилган ишларингизни бошқалар билан улашмоқчи бўлсангиз уларни асосий маълумотлар омборига юборишингиз (push) керак. Ушбу амаллар учун команда жуда оддий: git push [узоқ масофадаги сервер] [тармоқ]. Сизни master тармоғингизда қилган ишларингизни origin серверига жўнатишингиз учун (такрорлаб ўтамиз, клонлаштириш қоидага асосан ушбу икки номни автоматик тарзда созлаб қўяди) қуйидаги командаларни бажаришингиз мумкин:

$ git push origin master

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

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

Агар сиз бирор узоқ масофадаги омбор ҳақида кўпроқ маълумот олишни истасангиз сиз қуйидаги командани бажаришингиз мумкин: git remote show [узоқ масофадаги сервер] command. Агар сиз ушбу командани бирор бир ном билан бажарсангиз, масалан, origin билан сиз қуйидаги каби натижани оласиз:

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

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

Бу оддий ҳол учун мисол эди ва балким сиз ҳам шунга ўхшашига дуч келган бўлсангиз керак. Бироқ, агар сиз Git ни юқори интенсивда ишлатаётган бўлсангиз, сиз git remote show командасидан сўнг янада кўп сондаги маълумотларни кўришингиз мумкин:

$ git remote show origin
* remote origin
  URL: https://github.com/my-org/complex-project
  Fetch URL: https://github.com/my-org/complex-project
  Push  URL: https://github.com/my-org/complex-project
  HEAD branch: master
  Remote branches:
    master                           tracked
    dev-branch                       tracked
    markdown-strip                   tracked
    issue-43                         new (next fetch will store in remotes/origin)
    issue-45                         new (next fetch will store in remotes/origin)
    refs/remotes/origin/issue-11     stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    dev-branch merges with remote dev-branch
    master     merges with remote master
  Local refs configured for 'git push':
    dev-branch                     pushes to dev-branch                     (up to date)
    markdown-strip                 pushes to markdown-strip                 (up to date)
    master                         pushes to master                         (up to date)

Ушбу команда git push командаси бажарилганда ўзгаришсиз ҳолда айнан қайси маҳаллий тармоқ серверга жўнатилишини кўрсатади. У шунингдек, узоқ масофадаги тармоқлардан қайсилари сизда йўқ ва қайси тармоқлар серверда ўчирилган бўлсада сизда ҳали турганини ҳам кўрсатади. Шу билан бирга git pull командаси бажарилганда бар қанча тармоқларда қайси тармоқлардан уларга маълумотларни қуйиб олиш ва бирлаштириш иши бўлиши кўрсатилган.

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

Агар сиз гипер мурожаат номларини алмаштирмоқчи бўлсангиз git remote rename командасини ишлатасиз. Бу узоқ масофадаги омбор учун ишлатилаётган қисқа номни ўзргартиради. Масалан, сиз pb ни paul га алмаштирмоқчи бўлсангиз сиз уни қуйидаги тарзда git remote rename ёрдамида амалга оширишингиз мумкин:

$ git remote rename pb paul
$ git remote
origin
paul

Айтиш жоизки бу шунингдек узоқ масофадаги омбор тармоқлари номини ҳам ўзгартирган бўлади. Энди pb/master номлар paul/master га алмашган бўлади.

Агар сиз қайсидир сабабга кўра мурожаатни ўчирмоқчи бўлсангиз (сиз серверни ўзгартирдингизми ёки бошқа ушбу омбор мурожаатини ишлатмаябсизми ёҳуд ушбу мурожаатга тегишли омбор фаолдиги тугатилган) git remote rm ни ишлатишингиз мумкин:

$ git remote rm paul
$ git remote
origin