Git
Chapters ▾ 2nd Edition

2.5 Основе програма Гит - Рад са удаљеним репозиторијумима

Рад са удаљеним репозиторијумима

Да бисте могли да сарађујете на било ком Гит пројекту, морате да научите како да организујете удаљене репозиторијуме (remote repositories, често само remotes). Удаљени репозиторијуми су верзије пројекта које су хостоване на Интернету или негде на мрежи. Можете их имати неколико, од којих вам је сваки у општем случају или доступан само за читање (read-only) или и за читање и за упис (read/write). Сарадња са другима подразумева управљање тим удаљеним репозиторијумима и гурање (push) и повлачење (pull) података када је потребно поделити рад. Управљање удаљеним репозиторијумима подразумева да знате како се додају удаљени репозиторијуми, уклањају они који више нису важећи, управљање разним удаљеним гранама и њихово дефинисање као оне које се прате или оне које се не прате и још тога. У овом одељку ћемо прећи неке од тих вештина управљања удаљеним репозиторијумима.

Белешка
Удаљени репозиторијуми могу да се налазе и на вашој локалној машини.

Сасвим је могуће да радите са „remote” (удаљеним) репозиторијумом који се уствари налази на истом хосту на којем тренутно радите. Реч „remote” не повлачи обавезно да се репозиторијум налази негде на Интернету или на мрежи, већ само да је на неком другом месту. За рад са таквим удаљеним репозиторијумом су још увек потребне стандардне операције гурање, повлачење и добављање (fetching) као и са било којим другим удаљеним репозиторијумом.

Приказ удаљених репозиторијума

Да бисте видели које удаљени сервери су конфигурисани, можете да извршите команду git remote. Она приказује скраћена имена свих удаљених репозиторијума које сте задали. Ако сте клонирали репозиторијум, требало би да барем видите origin - то је подразумевано име које програм Гит даје серверу са кога сте извршили клонирање:

$ 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

Такође можете да наведете и -v, што ће приказати URL адресе које је програм Гит ускладиштио уз кратко име које се користе када се чита и пише у тај удаљени репозиторијум:

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

Ако имате више од једног удаљеног репозиторијума, ова команда ће их све излистати. На пример, репозиторијум са више удаљених репозиторијума за рад са неколико сарадника би могао да изгледа овако:

$ 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)

Ово значи да прилично једноставно можемо да повучемо доприносе од било ког од ових корисника. Можда додатно имамо и дозволу да шаљемо једном или више њих, мада то не можемо да видимо одавде.

Обратите пажњу на то како удаљени репозиторијуми користе разне протоколе; о овоме ћемо детаљније причати у Гранање у програму Гит.

Додавање удаљених репозиторијума

Поменули смо и показали на неколико примера како команда git clone имплицитно за вас додаје origin удаљени репозиторијум. Ево како се експлицитно додаје нови удаљени репозиторијум. Ако желите да додате нови удаљени Гит репозиторијум као кратко име на које ћете касније лако моћи да се позовете, извршите команду 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)

Сада у командној линији можете да користите pb уместо комплетне URL адресе. На пример, ако хоћете да добавите све информације које има Пол, а које ви још увек немате у свом репозиторијуму, можете да извршите 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 — можете да је спојите са неком од ваших грана, или у том тренутку можете да одјавите локалну грану ако желите да је прегледате. У Гранање у програму Гит ћемо се много детаљније позабавити тиме шта су тачно гране и како се користе.

Добављање и повлачење из удаљених репозиторијума

Као што сте управо видели, податке из својих удаљених пројеката добављате тако што извршите:

$ git fetch <име-удаљеног-репозиторијума>

Команда одлази до тог удаљеног пројекта и повлачи све податке са њега које још увек немате. Након што урадите ово, требало би да имате референце на све гране из тог удаљеног репозиторијума, које можете да спојите са својим или да их у било ком тренутку истражите.

Ако клонирате репозиторијум, команда аутоматски додаје тај удаљени репозиторијум под именом „origin”. Дакле, git fetch origin добавља сав нови рад који је гурнут на тај сервер након тренутка када сте га клонирали (или добавили с њега). Битно је напоменути да команда git fetch само преузима податке у ваш локални репозиторијум - не спаја их аутоматски са вашим радом нити мења оно на чему тренутно радите. Морате ручно да их спојите када будете спремни.

Ако је ваша текућа грана подешена тако да прати удаљену грану (за више информација погледајте следећи одељак и Гранање у програму Гит), можете да искористите команду git pull која аутоматски добавља, па затим спаја ту удаљену грану са вашом тренутном граном. За вас је ово можда једноставнији или удобнији процес рада; и са подразумеваним подешавањима, команда git clone аутоматски поставља локалну master грану тако да прати удаљену master грану (или како год се зове подразумевана грана) на серверу са којег сте извршили клонирање. Извршавање git pull у општем случају добавља податке са сервера са ког сте првобитно клонирали репозиторијум и аутоматски покушава да их споји са кодом на коме тренутно радите.

Белешка

Почевши од верзије 2.27 програма Гит па надаље, команда git pull ће издати упозорење у случају да променљива pull.rebase није постављена. Програм Гит ће наставити да издаје упозорење све док не поставите ову променљиву.

Ако желите подразумевано понашање програма гит (премотавање унапред (fast-forward) ако је то могуће, а у случају да није, креирање комита спајања): git config --global pull.rebase "false"

Ако желите да се одради ребазирање (rebase) када се повлачи: git config --global pull.rebase "true"

Гурање ка удаљеним репозиторијумима

Када ваш пројекат дође у стање у којем ваш рад пожелите да поделите са другима, морате да га погурате узводно. Команда за ово је проста: git push <име-удаљеног> <име-гране>. Ако своју master желите да погурате вашем origin серверу (још једном, клонирање у општем случају аутоматски поставља оба ова имена уместо вас), онда можете извршити следећу команду којом гурате на сервер све комитове које сте урадили:

$ git push origin master

Ова команда функционише само ако сте извршили клонирање са сервера на којем имате дозволу за упис и ако у међувремену нико није слао податке. Ако заједно са неким истовремено клонирате, па онда он или она пошаље измене узводно, а затим ви покушате да пошаљете своје, ваше измене ће с правом бити одбијене. Мораћете најпре да добавите његов или њен рад и да га уградите у свој пре него што вам буде дозвољено да пошаљете било шта. Погледајте Гранање у програму Гит за детаљније објашњење о томе како се шаље на удаљене сервере.

Истраживање удаљеног репозиторијума

Ако желите да видите више информација о одређеном удаљеном репозиторијуму, можете да искористите команду git remote show <име-удаљеног>. Ако ову команду покренете са одређеним кратким именом, као што је 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, аутоматски ће спојити master грану удаљеног репозиторијума са локалном након што је добави. Такође приказује и удаљене референце које су повучене.

Ово је прост пример са којим ћете се вероватно сусретати. Међутим, када мало озбиљније почнете да користите програм Гит, видећете много више информација ако извршите 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 remove или git remote rm:

$ git remote rm paul
$ git remote
origin

Једном када на овај начин уклоните референцу на удаљени репозиторијум, бришу се и све гране које прате удаљене, као и сва подешавања придружена том удаљеном репозиторијуму.