-
1. Почетак
- 1.1 О контроли верзије
- 1.2 Кратка историја програма Гит
- 1.3 Шта је Гит?
- 1.4 Командна линија
- 1.5 Инсталирање програма Гит
- 1.6 Подешавања за први пут
- 1.7 Тражење помоћи
- 1.8 Резиме
-
2. Основе програма Гит
- 2.1 Прављење Гит репозиторијума
- 2.2 Снимање промена над репозиторијумом
- 2.3 Преглед историје комитова
- 2.4 Опозив
- 2.5 Рад са удаљеним репозиторијумима
- 2.6 Означавање
- 2.7 Гит алијаси
- 2.8 Резиме
-
3. Гранање у програму Гит
- 3.1 Укратко о гранању
- 3.2 Основе гранања и спајања
- 3.3 Управљање гранама
- 3.4 Процеси рада са гранањем
- 3.5 Удаљене гране
- 3.6 Ребазирање
- 3.7 Резиме
-
4. Гит на серверу
- 4.1 Протоколи
- 4.2 Постављање програма Гит на сервер
- 4.3 Генерисање јавног SSH кључа
- 4.4 Подешавање сервера
- 4.5 Гит демон
- 4.6 Паметан HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Опције за хостовање које нуде трећа лица
- 4.10 Резиме
-
5. Дистрибуирани Гит
-
6. GitHub
-
7. Гит алати
- 7.1 Избор ревизија
- 7.2 Интерактивно стејџовање
- 7.3 Скривање и чишћење
- 7.4 Потписивање вашег рада
- 7.5 Претрага
- 7.6 Поновно исписивање историје
- 7.7 Демистификовани ресет
- 7.8 Напредно спајање
- 7.9 Rerere
- 7.10 Отклањање грешака са програмом Git
- 7.11 Подмодули
- 7.12 Паковање
- 7.13 Замена
- 7.14 Складиште акредитива
- 7.15 Резиме
-
8. Прилагођавање програма Гит
- 8.1 Конфигурисање програма Гит
- 8.2 Гит атрибути
- 8.3 Гит куке
- 8.4 Пример полисе коју спроводи програм Гит
- 8.5 Резиме
-
9. Гит и остали системи
- 9.1 Гит као клијент
- 9.2 Мигрирање на Гит
- 9.3 Резиме
-
10. Гит изнутра
- 10.1 Водовод и порцелан
- 10.2 Гит објекти
- 10.3 Гит референце
- 10.4 Pack фајлови
- 10.5 Рефспек
- 10.6 Протоколи за пренос
- 10.7 Одржавање и опоравак податак
- 10.8 Променљиве окружења
- 10.9 Резиме
-
A1. Додатак А: Програм Гит у другим окружењима
- A1.1 Графички интерфејси
- A1.2 Гит у Visual Studio
- A1.3 Гит у Visual Studio Code
- A1.4 Гит у IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Гит у Sublime Text
- A1.6 Гит унутар Bash
- A1.7 Гит у Zsh
- A1.8 Гит у Powershell
- A1.9 Резиме
-
A2. Додатак Б: Уграђивање програма Гит у ваше апликације
- A2.1 Гит из командне линије
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Додатак В: Гит команде
- A3.1 Подешавање и конфигурација
- A3.2 Набављање и креирање пројеката
- A3.3 Основно снимање
- A3.4 Гранање и спајање
- A3.5 Дељење и ажурирање пројеката
- A3.6 Инспекција и поређење
- A3.7 Отклањање грешака
- A3.8 Крпљење
- A3.9 Имејл
- A3.10 Спољни системи
- A3.11 Администрација
- A3.12 Водоводне команде
10.5 Гит изнутра - Рефспек
Рефспек
Кроз ову књигу смо користили једноставна мапирања из удаљених грана на локалне референце, али она могу бити и сложенија. Претпоставимо да сте пратили неколико последњег одељака и креирали мали локални Гит репозиторијум, па сада желите да му додате remote (удаљени репозиторијум):
$ git remote add origin https://github.com/schacon/simplegit-progit
Извршавање ове команде додаје одељак у .git/config
фајлу вашег репозиторијума, са наведеним именом удаљеног репозиторијума (origin
), његовом URL адресом и рефспек (спецификацију референце) који ће се користити за преузимање:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
Формат рефспека је прво необавезни +
за којим следи <изв>:<одр>
, где је <изв>
шаблон за референце на удаљеној страни, а <одр>
је место на којем ће се те референце пратити локално.
Знак +
говори програму Гит да ажурира референцу чак и ако није у питању премотавање унапред.
У подразумеваном случају који аутоматски уписује команда git remote add
, програм Гит преузима све референце под refs/heads/
на серверу и пише их локално у refs/remotes/origin/
.
Дакле, ако на серверу постоји master
грана, локално можете да приступите њеном логу на било који од следећих начина:
$ git log origin/master
$ git log remotes/origin/master
$ git log refs/remotes/origin/master
Сви су еквивалентни, јер их програм Гит развија на refs/remotes/origin/master
.
Ако уместо тога желите да програм Гит сваки пут довуче само master
грану, а не и сваку другу грану са удаљеног сервера, линију за преузимање можете да промените тако да указује само ту грану:
fetch = +refs/heads/master:refs/remotes/origin/master
Ово је само подразумевани рефспек за git fetch
за тај удаљени репозиторијум.
Ако само једном желите да преузмете, одређени рефспек такође можете да наведете и на командној линији.
Ако желите да master
грану на удаљеном репозиторијуму повучете у локалну origin/mymaster
, извршите следеће:
$ git fetch origin master:refs/remotes/origin/mymaster
Такође можете да наведете и више рефспекова. Овако из командне линије повлачите неколико грана одједном:
$ git fetch origin master:refs/remotes/origin/mymaster \
topic:refs/remotes/origin/topic
From git@github.com:schacon/simplegit
! [rejected] master -> origin/mymaster (non fast forward)
* [new branch] topic -> origin/topic
У овом случају је повлачење master
гране одбијено јер није у питању референца са брзим премотавањем унапред.
То можете да премостите ако испред рефспека наведете +
.
Више рефспекова такође можете да наведете и у конфигурационом фајлу.
Ако сваки пут желите да преузимате master
и experiment
гране, додајте две линије:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/experiment:refs/remotes/origin/experiment
Почевши са програмом Гит 2.6.0 у шаблону можете да користите парцијалне глобове који се подударају са више грана, тако да следеће функционише:
fetch = +refs/heads/qa*:refs/remotes/origin/qa*
Још боље, исто можете да постигнете на уређенији начин ако употребите просторе имена (или директоријуме).
Ако имате QA тим (тим за контролу квалитета) који гура низ грана, а ви желите да преузмете master
грану и било коју од грана QA тима, али ништа друго, можете да употребите овакав конфигурациони одељак:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/qa/*:refs/remotes/origin/qa/*
Ако користите компликован процес рада у којем QA тим гура гране, програмери гурају гране и тимови за интеграцију гурају и сарађују на удаљеним гранама, на овај начин можете лако да их раздвојите у просторе имена.
Гурање рефспекова
Лепо је што референцу из простора имена можете да преузмете на овај начин, али како је уопште QA ставио њихове гране у qa/
простор имена?
То се постиже употребом рефспекова за гурање.
Ако QA тим жели да своју master
грану гурне на qa/master
на удаљеном серверу, могу да изврше:
$ git push origin master:refs/heads/qa/master
Ако желе да програм Гит аутоматски то ради сваки пут када изврше git push origin
, у свој конфигурациони фајл могу да додају push
вредност:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
push = refs/heads/master:refs/heads/qa/master
Да поновимо, после овога ће git push origin
подразумевано да гурне локалну master
грану branch на удаљену грану qa/master
.
Белешка
|
Рефспек не можете да искористите за преузимање из једног репозиторијума и гурање на други. Ако то желите да урадите, погледајте пример Одржавање вашег јавног GitHub репозиторијума ажурним. |
Брисање референци
Рефспек можете употребити и за брисање референци са удаљеног сервера тако што извршите нешто овако:
$ git push origin :topic
Пошто је рефспек <изв>:<одр>
, ако изоставите <изв>
део, у суштини кажете да се topic
грана на удаљеном репозиторијуму постави ни на шта, односно да се обрише.
Или можете да употребите новију синтаксу (доступно од Гит v1.7.0):
$ git push origin --delete topic