-
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 Водоводне команде
6.3 GitHub - Одржавање пројекта
Одржавање пројекта
Сада када знамо како се даје допринос пројекту, хајде да погледамо другу страну: креирање, одржавање и администрирање сопственог пројекта.
Креирање новог репозиторијума
Креирајмо нови репозиторијум на коме ћемо делити кôд нашег пројекта.
Почните кликом на дугме „New repository” у горњем десном углу командне табле, или на дугме +
у алатној траци поред вашег корисничког имена као што се види на Падајући мени „New repository”.
![Област „Your repositories”](png/newrepo.png)
![Падајући мени „new repository”](png/new-repo.png)
Ово вас води на форму „new repository”:
![Форма „new repository”](png/newrepoform.png)
Све што овде стварно треба да урадите је да дате име пројекту; остала поља уопште нису обавезна.
Засад, само кликните на дугме „Create Repository”, и бум — имате нов репозиторијум на сервису GitHub, назван <корисник>/<име_пројекта>
.
Пошто тамо још увек немате никакав кôд, GitHub ће вам показати упутства како да направите потпуно нов Гит репозиторијум, или да га се повежете са постојећим Гит пројектом. Нећемо се враћати на ово овде; ако треба да се подсетите, баците око на Основе програма Гит.
Сада када се ваш пројекат хостује на сервису GitHub, можете да дате URL сваком с ким желите да поделите пројекат.
Сваком пројекту на сервису GitHub се може приступити прекор HTTPS као https://github.com/<корисник>/<име_пројекта>
, и преко SSH као git@github.com:<корисник>/<име_пројекта>
.
Програм Гит може да преузима и да гура на обе ове URL адресе, али се контрола приступа врши на основу акредитације корисника који им приступа.
Белешка
|
Често је боље да се дели HTTPS URL јавног пројекта, пошто корисник не мора да има GitHub налог да би му приступио у циљу клонирања. Корисници ће морати да имају налог и постављен SSH кључ да приступе вашем пројекту ако им дате SSH URL. HTTP URL је такође потпуно исти URL који би прекопирали у интернет прегледач да у њему погледају пројекат. |
Додавање сарадника
Ако радите са другим људима којима желите омогућити да могу комитовати, треба да их додате као „сараднике”. Ако Бен, Џеф и Луиз сви отворе налог на сервису GitHub и желите да им дате приступ за гурање на ваш репозиторијум, можете да их додате на свој пројекат. То ће им дати приступ за „гурање”, што значи да ће моћи и да читају и пишу по пројекту и по Гит репозиторијуму.
Кликните на линк „Settings” на дну траке са десне стране.
![Линк за подешавање репозиторијума](png/reposettingslink.png)
Онда из менија са леве стране одаберите „Collaborators”. Затим само укуцајте корисничко име у поље за унос, и кликните „Add collaborator”. Ово можете да поновите онолико пута колико је потребно да бисте дали приступ свима коме желите. Ако треба да опозовете приступ, само кликните на „X” са десне стране одговорајућег реда.
![Поље сарадници репозиторијума](png/collaborators.png)
Управљање захтевима за повлачење
Сада када имате пројекат са неким кодом а можда чак и неколико сарадника који имају приступ гурању промена, хајде да видимо шта да радите када добијете захтев за повлачење.
Захтеви за повлачење могу да дођу или са гране у рачви вашег репозиторијума, или са друге гране из истог репозиторијума. Једина разлика је у томе што они из рачве обично припадају другим људима где ви не можете да гурнете на њихову грану и они не могу на вашу, док код интерних захтева за повлачење у општем случају оба лица имају приступ грани.
За ове примере, претпоставићемо да сте ви „tonychacon” и да сте направили нови пројекат Ардуино кода који се зове „fade”.
Имејл обавештења
Неко дође, направи промене у у вашем коду и пошаље вам захтев за повлачење. Требало да добијете имејл који вас обавештава о новом захтеву за повлачење и требало би да изгледа отприлике као Имејл обавештење о новом захтеву за повлачење.
![Имејл обавештење о новом захтеву за повлачење](png/maint-01-email.png)
Постоји неколико ствари у вези овог имејла које треба да приметите. Даће вам кратку статистику о разликама — листу фајлова који су се променили у захтеву за повлачење и за колико. Даје вам линк ка захтеву за повлачење на сервису GitHub. Такође вам даје и неколико URL адреса које можете да користите из командне линије.
Ако приметите линију која каже git pull <url> patch-1
, ово је једноставан начин да се споји удаљена грана без потребе да ручно додајете удаљени репозиторијум.
Брзо смо прешли ово у Одјављивање удаљених грана.
Ако желите, можете да креирате и скочите на тематску грану, па да онда извршите ову команду да спојите промене из захтева за повлачење.
Друге занимљиве URL адресе су .diff
и .patch
адресе, које као што погађате, верзију захтева за повлачење као уједињену разлику и закрпу.
Технички можете да спојите захтев за повлачење некако овако:
$ curl http://github.com/tonychacon/fade/pull/1.patch | git am
Сарадња на захтеву за повлачење
Како смо објаснили у GitHub процес рада, сада можете да поразговарате са особом која је отворила захтев за повлачење. Можете да коментаришете одређене линије кода, да коментаришете целе комитове или пак на читав захтев за повлачење, користећи Маркдаун синтаксу са GitHub укусом.
Сваки пут када неко други коментарише на захтев за повлачење, добићете имејл обавештење и тако знате да се дешава нека активност. Сваки од њих ће имати линк ка захтеву за повлачење где се активност догађа, а можете и директно у имејлу да одговорите и тако објавите свој коментар у низ захтева за повлачење.
![Имејл одговор](png/maint-03-email-resp.png)
Онда када кôд буде сређен и када пожелите да га спојите, можете или да повучете кôд и спојите га локално, или да искористите git pull <url> <branch>
синтаксу коју смо видели раније, или да рачву додате као удаљени репозиторијум па онда преузимате и спајате.
Ако је спајање тривијалано, можете и само да притиснете дугме „Merge” на GitHub веб сајту. Ово ће урадити „не премотавај унапред” спајање, што значи да ће направити комит спајања чак и ако је могуће спајање премотавањем унапред. Ово значи да ће без обзира на све, кадгод притиснете „Merge” дугме настати нови комит спајања. Као што видите у Дугме Merge и упутство за ручно спајање захтева за повлачење, GitHub вам даје све ове информације ако кликнете на линк савета.
Ако одлучите да не желите да га спојите, можете и да само затворите захтев за повлачење и особа која га је отворила ће бити обавештена.
Референце на захтев за повлачење
Ако баратате са пуно захтева за повлачење и не желите да додате гомилу удаљених репозиторијума или да сваки пут радите једнократно повлачење, GitHub вам омогућава да употребите један добар трик. Ово је делић напредног трика чије детаље ћемо обрадити у Рефспек, али може да буде јако користан.
GitHub заправо оглашава гране које су захтев за повлачење репозиторијума као врсту псеудограна на серверу. Подразумевано их не добијате када клонирате, али оне су ту прикривене и можете да им приступите прилично једноставно.
Да бисмо ово показали, користићемо команду ниског нивоа (често се користи термин „цевоводна” plumbing команда, о чему ћете више прочитати у Водовод и порцелан) која се зове ls-remote
.
Ова команда се у општем случају не користи у свакодневним Гит операцијама али је корисна да нам покаже које референце постоје на серверу.
Ако извршимо ову команду над „blink” репозиторијумом који смо раније користили, добићемо листу свих грана и ознака и осталих референци у репозиторијуму.
$ git ls-remote https://github.com/schacon/blink
10d539600d86723087810ec636870a504f4fee4d HEAD
10d539600d86723087810ec636870a504f4fee4d refs/heads/master
6a83107c62950be9453aac297bb0193fd743cd6e refs/pull/1/head
afe83c2d1a70674c9505cc1d8b7d380d5e076ed3 refs/pull/1/merge
3c8d735ee16296c242be7a9742ebfbc2665adec1 refs/pull/2/head
15c9f4f80973a2758462ab2066b6ad9fe8dcf03d refs/pull/2/merge
a5a7751a33b7e86c5e9bb07b26001bb17d775d1a refs/pull/4/head
31a45fc257e8433c8d8804e3e848cf61c9d3166c refs/pull/4/merge
Наравно, ако сте у свом репозиторијуму и извршите git ls-remote origin
или који год удаљени репозиторијум желите да проверите, показаће вам нешто слично овоме.
Ако се репозиторијум налази на GitHub сервису и имате отворене захтеве за повлачење, ове референце ћете добити са префиксом refs/pull/
.
Ово су у суштини гране, али пошто нису под refs/heads/
обично их не добијате када клонирате или преузимате податке са сервера — процес преузимања их обично игнорише.
Постоје по две референце за сваки захтев за повлачење — она која се завршава са /head
показује на потпуно исти комит који је и последњи комит у грани захтева за повлачење.
Дакле, ако неко у нашем репозиторијуму отвори захтев за повлачење, његова грана се зове bug-fix
и показује на комит a5a775
, онда у нашем репозиторијуму нећемо имати грану bug-fix
(пошто је она у његовој рачви), али имаћемо pull/<зп#>/head
која показује на a5a775
.
Ово значи да можемо доста лако да повучемо сваку грану захтева за повлачење без потребе да додајемо гомилу удаљених репозиторијума.
Сада, можете да урадите нешто као директно преузимање референце.
$ git fetch origin refs/pull/958/head
From https://github.com/libgit2/libgit2
* branch refs/pull/958/head -> FETCH_HEAD
Ово говори програму Гит, „Повежи се на origin
удаљени репозиторијум и преузми референцу са именом refs/pull/958/head
.”
Програм Гит вас са задовољством слуша и преузима све што вам треба да конструишете ту референцу и ставља показивач на комит који желите под .git/FETCH_HEAD
.
Након овога можете да извршите git merge FETCH_HEAD
у грану у којој желите да тестирате, али та порука комита спајања комита изгледа помало чудно.
Такође, ако разматрате много захтева за повлачење, ово постаје заморно.
Постоји и начин да преузмете све захтеве за повлачење и да их одржите актуелним сваки пут када се повежете на удаљени репозиторијум.
Отворите у свом омиљеном едитору .git/config
и потражите origin
удаљени репозиторијум.
Требало би да изгледа некако овако:
[remote "origin"]
url = https://github.com/libgit2/libgit2
fetch = +refs/heads/*:refs/remotes/origin/*
Она линија која почиње са fetch =
је такозвани рефспек.
То је начин мапирања имена на удаљеном репозиторијуму у имена у вашем локалном .git
директоријуму.
Линија из примера говори програму Гит „ствари на удаљеном репозиторијуму које се налазе под refs/heads
треба да иду у мој локални репозиторијум под `refs/remotes/origin`".
Можете изменити овај одељак тако да додате још један рефспек:
[remote "origin"]
url = https://github.com/libgit2/libgit2.git
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
Последња линија каже програму Гит, „све референце који изгледају као refs/pull/123/head
треба да се локално сместе као refs/remotes/origin/pr/123
”.
Сада, ако сачувате тај фајл и урадите git fetch
:
$ git fetch
# …
* [new ref] refs/pull/1/head -> origin/pr/1
* [new ref] refs/pull/2/head -> origin/pr/2
* [new ref] refs/pull/4/head -> origin/pr/4
# …
Сада се сви удаљени захтеви за повлачење локално представљају референцама које понашају слично као и пратеће гране; могуће их је само читати и ажурирају се када обавите преузимање. Овако је супер једноставно да испробате кôд из захтева за спајање локално:
$ git checkout pr/2
Checking out files: 100% (3769/3769), done.
Branch pr/2 set up to track remote branch pr/2 from origin.
Switched to a new branch 'pr/2'
Они који имају око соколово приметиће да је head
на крају удаљеног дела рефспека.
Постоји и refs/pull/#/merge
референца на GitHub страни, што представља комит који би настао ако притиснете „merge” дугме на сајту.
Ово вам омогућава да тестирате спајање и пре него што уопште притиснете дугме.
Захтеви за повлачење на захтевима за повлачење
Не само да можете отварати захтеве за повлачење који као одредиште имају главну или master
грану, већ можете и да отворите захтев за повлачење који као одредиште има било коју грану на мрежи.
Заправо, одредиште може бити и други захтев за повлачење.
Ако видите захтев за повлачење који иде у добром правцу и имате идеју за промену која зависи од њега, или ниста сигурни да ли је то добра идеја, или једноставно немате приступ гурању измена на одредишну грану, можете да отворите захтев за повлачење директно на њега.
Када отворите захтев за повлачење, појавиће се поље на врху стране које наводи ка којој грани желите да будете повучени и од које захтевате да повучете. Ако притиснете дугме „Edit” са десне стране тог поља, можете да промените не само гране већ и на којој рачви.
![Одредишта захтева за повлачење](png/maint-04-target.png)
Овде прилично лако можете навести да спајате своју нову грану у други захтев за повлачење или другу рачву пројекта.
Помињање и обавештења
GitHub такође има уграђен и прилично добар систем обавештења који је може бити од користи када имате питања или вам треба повратна информација од одређених особа или целих тимова.
У било ком коментару можете почети да куцате карактер @
и покренуће се ауто довршавање са именима и корисничким именима људи који су сарадници или дају допринос пројекту.
![Помињања](png/maint-05-mentions.png)
Можете да поменете и корисника који није на тој падајућој листи, али ауто довршавач често то може да убрза.
Када објавите коментар у коме помињете корисника, он или она ће бити обавештени. То значи да ово може бити веома ефикасан начин позивања људи у разговоре, уместо да сами морају да питају. У GitHub захтевима за повлачење људи ће врло често позивати друге људе из свог тима или компаније да ураде рецензију захтева за повлачење или тикета.
Ако неко буде поменут на захтеву за повлачење или тикету, биће „претплаћени” на њега и наставиће да добијају обавештења сваки пут када се ту догоди нека активност. И ви ћете такође бити претплаћени на све што сами отворите, ако надгледате (watch) репозиторијум или ако коментаришете на нешто. Ако више не желите да добијате обавештења, на страници постоји дугме „Unsubscribe” на које можете кликнути и престаћете да добијате новости о њој.
![Престанак претплате](png/maint-06-unsubscribe.png)
Страница са обавештењима
Када овде кажемо „обавештење” у контексту сервиса GitHub, мислимо на одређени начин којим сервис GitHub покушава да ступи у контакт са вама онда када се догоде неки догађаји. Постоји неколико различитих начина да конфигуришете обавештења. Ако одете на картицу „Notification center” странице за подешавања, видећете неке од опција које имате.
![Центар за обавештавање](png/maint-07-notifications.png)
Постоје два избора: добијање обавештења путем имејла (Email) или путем веба (Web) и можете да изаберете једно од њих, ниједно, или оба у случају када активно учествујете у стварима и за активности на репозиторијумима које надгледате.
Веб обавештења
Веб обавештења постоје само сервису GitHub и можете да их погледате само на GitHub веб сајту. Ако вам је ова опција изабрана у подешавањима, па се окине обавештење за вам, видећете малу плаву тачку преко ваше иконице за обавештења у горњем делу екрана као што се види на Центар за обавештења.
![Центар за обавештења](png/maint-08-notifications-page.png)
Ако кликнете на то, појавиће се листа свих ставки о којима сте обавештени, груписана по пројектима. Обавештења можете да филтрирате по одређеном пројекту тако што кликнете на његово име у траци са леве стране. Можете и да потврдите обавештење кликом на иконицу штиклирања поред било ког обавештења, или да потврдите сва обавештења у пројекту тако што ћете кликнути на иконицу штиклирања на врху групе. Постоји и дугме за утишавање обавештења поред сваке иконице штиклирања на које можете да кликнете уколико више не желите да добијате обавештења у вези с том ставком.
Сви ови алати су веома корисни за руковање великим бројем обавештења. Многи напредни корисници сервиса GitHub ће једноставно искључити сва обавештења путем имејла и у потпуности управљати свим обавештењима преко овог екрана.
Имејл обавештења
Обавештења путем имејла су још један начин за руковање обавештењима на сервису GitHub. Ако вам је ова опција укључена, добијаћете имејл за свако обавештење. Видели смо примере овога у Коментари послати као имејл обавештења и Имејл обавештење о новом захтеву за повлачење. Имејлови ће такође бити исправно смештени у тематске низове, што је лепо ако користите имејл клијент који подржава овај вид прегледа имејлова.
У заглавља имејлова које вам шаље сервис GitHub се уграђује и поприлична количина метаподатака, што може да буде веома корисно за постављате персонализованих филтера и правила.
На пример, ако погледамо имејл заглавља послата Тонију у имејлу који је приказан у Имејл обавештење о новом захтеву за повлачење, видећемо следеће међу осталим информацијама:
To: tonychacon/fade <fade@noreply.github.com>
Message-ID: <tonychacon/fade/pull/1@github.com>
Subject: [fade] Wait longer to see the dimming effect better (#1)
X-GitHub-Recipient: tonychacon
List-ID: tonychacon/fade <fade.tonychacon.github.com>
List-Archive: https://github.com/tonychacon/fade
List-Post: <mailto:reply+i-4XXX@reply.github.com>
List-Unsubscribe: <mailto:unsub+i-XXX@reply.github.com>,...
X-GitHub-Recipient-Address: tchacon@example.com
Овде има неколико занимљивих ствари.
Ако желите да истакнете или преусмерите имејлове за овај одређени пројекат или чак за захтев за повлачење, информација у Message-ID
вам даје све податке у формату <корисник>/<пројекат>/<тип>/<id>
.
На пример, да је ово тикет, у пољу <тип>
би уместо pull писало issues.
Поља List-Pos
и List-Unsubscribe
значе да ако имате клијент за мејл који разуме ово, можете лако да шаљете на листу или да укинете претплату са теме.
То би у суштини било исто као да кликнете на дугме „mute” у веб верзији обавештења или на „Unsubscribe” на самој страници захтева за повлачење или тикета.
Такође вреди напоменути да ако су вам укључена и имејл и веб обавештења, па прочитате мејл верзију обавештења, веб верзија ће се такође означити као прочитана, ако су слике дозвољене у вашем имејл клијенту.
Посебни фајлови
Ако у вашем репозиторијуму постоји неколико посебних фајлова, сервис GitHub ће их приметити.
README
Први фајл је README
, он може бити у скоро било ком формату који сервис GitHub препознаје као прозу.
На пример, може да буде README
, README.md
, README.asciidoc
, итд.
Ако сервис GitHub у вашем изворном коду види README
фајл, приказаће га на почетној страници пројекта.
Многи тимови у овај фајл записују све релевантне информације о пројекту за неког ко је можда нов на репозиторијуму или пројекту. Обично се овде пишу следеће ствари:
-
Шта је намена пројекта
-
Како га конфигурисати и инсталирати
-
Пример који показује како се користи или како да се покрене
-
Лиценца под којом је пројекат доступан
-
Како се даје допринос пројекту
Пошто ће сервис GitHub приказивати овај фајл, можете да уградите слике или линкове да би олакшали разумевање документа.
CONTRIBUTING
Други посебан фајл који сервис GitHub препознаје је фајл CONTRIBUTING
.
Ако имате фајл CONTRIBUTING
са било којом екстензијом, GitHub ће приказати Отварање захтева за повлачење када постоји фајл CONTRIBUTING
кад год неко отвори захтев за повлачење.
![Белешка о давању доприноса](png/maint-09-contrib.png)
CONTRIBUTING
Идеја је да овде наведете одређене ствари које желите или не желите да буду део захтева за повлачење који се шаљу вашем пројекту. На овај начин људи ће заправо моћи да прочитају смернице и пре него што отворе захтев за повлачење.
Администрација пројекта
У општем случају нема много административних ствари које можете да радите са само једним пројектом, али постоји неколико ставки које би могле бити интересантне.
Мењање подразумеване гране
Ако као подразумевану грану над којом желите да људи отварају захтеве за повлачење или да је подразумевано виде користите неку грану која није master
, можете то да промените на страници подешавања репозиторијума у картици „Options”.
![Подразумевана грана](png/maint-10-default-branch.png)
Једноставно промените подразумевану грану у падајућој листи и то ће постати подразумевана грана за све главне операције од тада па надаље, укључујући и то која грана се подразумевано одјављује када неко клонира репозиторијум.
Пренос пројекта
Ако пожелите да свој пројекат пренесте другом кориснику или организацији на сервису GitHub, постоји опција „Transfer ownership” на дну исте „Options” картице на страници подешавања вашег репозиторијума која вам то омогућава.
![Пренос](png/maint-11-transfer.png)
Ово је од помоћи ако напуштате пројекат и неко други жели да га преузме, или ако пројекат постаје све већи и желите да га преместите у организацију.
Ово не само да премешта репозиторијум заједно са свим пратиоцима и звездицама на друго место, већ подешава и преусмеравање са ваш УРЛ адресе на ново место. Преусмеравају се и клонирања и преузимања из програма Гит, не само веб захтеви.