git

Thank you for reading this post, don't forget to subscribe!

Git – это рас­пре­де­лен­ная систе­ма кон­тро­ля вер­сий с откры­тым исход­ным кодом.   Эта систе­ма поз­во­ля­ет без тру­да выпол­нять ветв­ле­ние и сли­я­ние, а так­же дает воз­мож­ность управ­лять несколь­ки­ми уда­лен­ны­ми репо­зи­то­ри­я­ми одно­го про­ек­та и вести его рас­пре­де­лен­ную разработку.

Установка Git с помощью Yum

Как и боль­шин­ство дис­три­бу­ти­вов Linux, CentOS поз­во­ля­ет ска­чать git из сво­е­го репо­зи­то­рия по умол­ча­нию. Что­бы уста­но­вить послед­нюю в репо­зи­то­рии вер­сию паке­та введите:

yum install git

Вве­ди­те «y», что­бы под­твер­дить уста­нов­ку. Затем систе­ма git будет уста­нов­ле­на на сер­вер и гото­ва к работе.

Установка Git из исходного кода

Что­бы полу­чить послед­нюю доступ­ную вер­сию Git, луч­ше ска­чать и ском­пи­ли­ро­вать дан­ную систе­му из исход­но­го кода.

На момент напи­са­ния ста­тьи послед­ней доступ­ной в репо­зи­то­рии CentOS вер­си­ей git явля­ет­ся 1.7.1,

Итак, сна­ча­ла нуж­но ска­чать инстру­мен­ты ком­пи­ля­ции для CentOS (Development Tools) с помо­щью сле­ду­ю­щей команды:

yum groupinstall "Development Tools"

Это поз­во­лит уста­но­вить инстру­мен­ты и ком­пи­ля­то­ры, необ­хо­ди­мые для пре­об­ра­зо­ва­ния исход­но­го кода в испол­ня­е­мые файлы.

Завер­шив уста­нов­ку инстру­мен­тов ком­пи­ля­ции, нуж­но уста­но­вить зави­си­мо­сти git, без кото­рых систе­му не полу­чит­ся уста­но­вить или запустить.

yum install zlib-devel perl-ExtUtils-MakeMaker asciidoc xmlto openssl-devel

Когда все выше­пе­ре­чис­лен­ные зави­си­мо­сти уста­нов­ле­ны, мож­но при­сту­пать к загруз­ке послед­ней вер­сии исход­но­го кода, кото­рая раз­ме­ще­на на github.com:

cd ~
wget -O git.zip https://github.com/git/git/archive/master.zip

Рас­па­куй­те архив и перей­ди­те в ката­лог проекта:

unzip git.zip
cd git-master

Теперь мож­но собрать испол­ня­е­мые фай­лы и доку­мен­та­цию, а затем уста­но­вить git при помо­щи сле­ду­ю­ще­го набо­ра команд:

make configure
./configure --prefix=/usr/local
make all doc
sudo make install install-doc install-html

Обра­ти­те вни­ма­ние: обно­вить систе­му git мож­но при помо­щи самой git. Когда появит­ся необ­хо­ди­мость обно­вить git, кло­ни­руй­те git-репо­зи­то­рий с сай­та github в новый ката­лог, а затем собе­ри­те и уста­но­ви­те новую вер­сию ( как пока­за­но выше):

git clone git://github.com/git/git

Настройка Git

При ком­ми­те изме­не­ний Git ука­зы­ва­ет имя поль­зо­ва­те­ля и адрес элек­трон­ной почты в сооб­ще­нии о ком­ми­те; это дела­ет­ся для того, что­бы лег­ко отсле­жи­вать изменения.

Если не вне­сти эту инфор­ма­цию в настрой­ки, Git попро­бу­ет уга­дать ее (и, конеч­но, может оши­бить­ся), осно­вы­ва­ясь на име­ни поль­зо­ва­те­ля Linux и име­ни хоста.

Пото­му реко­мен­ду­ет­ся предо­ста­вить систе­ме Git все эти дан­ные; Для это­го исполь­зуй­те сле­ду­ю­щие команды:

git config --global user.name "Your Name Here"
git config --global user.email "your_email@example.com"

Изме­не­ния настро­ек будут хра­нить­ся в фай­ле, кото­рый нахо­дит­ся в домаш­нем ката­ло­ге. Что­бы про­смот­реть этот файл, исполь­зуй­те про­стой тек­сто­вый редактор:

nano ~/.gitconfig
[user]
name = Your Name Here
email = your_email@example.com

Редак­тор по умолчанию:

git config --global core.editor nano

И ути­ли­ту сравнения:

git config --global merge.tool vimdiff

Кро­ме того, эту инфор­ма­цию мож­но про­смот­реть, запро­сив у git теку­щие настрой­ки конфигурации:

git config --list
user.name=Your Name Here
user.email=your_email@example.com

Создание рабочего пространства

На дан­ном эта­пе нуж­но поза­бо­тить­ся о чистом рабо­чем про­стран­стве (workspace) для коди­ро­ва­ния, осо­бен­но если код будет раз­ра­ба­ты­вать­ся для несколь­ких про­ек­тов сра­зу. Реко­мен­ду­ет­ся создать отдель­ную пап­ку по име­ни git в домаш­нем ката­ло­ге, кото­рый содер­жит под­ка­та­ло­ги для каж­до­го проекта.

Итак, для нача­ла нуж­но создать рабо­чее пространство.

mkdir -p ~/git/testing ; cd ~/git/testing

Дан­ная коман­да выпол­ня­ет два действия:

  1. созда­ет в домаш­нем ката­ло­ге ката­лог по име­ни git и под­ка­та­лог testing (здесь будет хра­нить­ся проект);
  2. пере­хо­дит в базо­вый ката­лог проекта.

В базо­вом ката­ло­ге нуж­но создать несколь­ко фай­лов для про­ек­та. На этом эта­пе мож­но либо сле­до­вать руко­вод­ству и создать несколь­ко фик­тив­ных фай­лов для тести­ро­ва­ния, либо создать файлы/каталоги, кото­рые поз­же ста­нут частью реаль­но­го проекта.

Что­бы создать тесто­вый файл для репозитория:

touch file

Создав в рабо­чем про­стран­стве все необ­хо­ди­мые фай­лы, попро­буй­те отсле­дить фай­лы при помо­щи git. Как это сде­лать, пока­жет сле­ду­ю­щий раздел.

Конвертирование существующего проекта

Когда все нуж­ные фай­лы нахо­дят­ся в рабо­чем про­стран­стве git, нуж­но ска­зать git исполь­зо­вать теку­щий ката­лог как сре­ду git.

Коман­да git init созда­ёт новый репо­зи­то­рий. Её мож­но исполь­зо­вать для пре­вра­ще­ния уже суще­ству­ю­ще­го про­ек­та в Git-репо­зи­то­рий – или для созда­ния ново­го. Боль­шин­ство дру­гих команд Git не смо­гут рабо­тать вне про­и­ни­ци­а­ли­зи­ро­ван­но­го репо­зи­то­рия, поэто­му как пра­ви­ло – это пер­вая коман­да при запус­ке ново­го проекта.

Выпол­не­ние коман­ды git init созда­ёт ката­лог .git в корне про­ек­та, кото­рый будет содер­жать все необ­хо­ди­мые мета­дан­ные для репо­зи­то­рия. Сам ката­лог про­ек­та оста­ёт­ся без изме­не­ний (в отли­чии от SVN – Git не созда­ёт ката­лог .git в каж­дой вло­жен­ной дири­ек­то­рии проекта).

user@host ~/git/testing $ git init
Initialized empty Git repository in /home/user/git/testing/.git/

Создав новый пустой репо­зи­то­рий, добавь­те в него нуж­ные фай­лы и каталоги.

Для это­го исполь­зуй­те сле­ду­ю­щую строку:

user@host ~/git/testing $ git add .

В дан­ном слу­чае не долж­но появить­ся ника­ко­го выво­да (к сожа­ле­нию, Git не все­гда сооб­ща­ет о пра­виль­ной рабо­те компонентов).

Вся­кий раз, когда в репо­зи­то­рии добав­ля­ют­ся новые или изме­ня­ют­ся уже суще­ству­ю­щие фай­лы, нуж­но созда­вать сооб­ще­ние к ком­ми­там (или commit message).

git init --bare <directory>

Ини­ци­а­ли­зи­ру­ет пустой репо­зи­то­рий Git, но без рабо­че­го ката­ло­га. Общие репо­зи­то­рии все­гда долж­ны созда­вать­ся с фла­гом --bare (ниже мы рас­смот­рим этот момент). Обще­при­ня­то, что име­на ката­ло­гов репо­зи­то­ри­ев, про­и­ни­ци­ли­зи­ро­ван­ных с --bare закан­чи­ва­ют­ся на .git. Напри­мер, неизо­ли­ро­ван­ный (bare) репо­зи­то­рий с име­нем my-project дол­жен хра­нить­ся в ката­ло­ге с име­нем my-project.git.

 

Создание сообщений коммита

Сооб­ще­ние ком­ми­та, или сооб­ще­ние о ком­ми­те (commit message) – это корот­кое сооб­ще­ние, объ­яс­ня­ю­щее вне­сен­ные изме­не­ния. Такие сооб­ще­ния необ­хо­ди­мо созда­вать перед отправ­кой изме­не­ний коди­ро­ва­ния (кото­рый назы­ва­ет­ся push); это отлич­ный спо­соб объ­яс­нить осталь­ным раз­ра­бот­чи­кам про­ек­та, что имен­но было изме­не­но в коде и чего от этих изме­не­ний ожидать.

Сооб­ще­ния ком­ми­тов, как пра­ви­ло, доста­точ­но корот­кие (в пре­де­лах 1-2 пред­ло­же­ний) и долж­ны изла­гать вне­сен­ные поправ­ки. Реко­мен­ду­ет­ся созда­вать сооб­ще­ние о каж­дом вне­сен­ном изме­не­нии, преж­де чем пере­дать код. Мож­но пере­да­вать столь­ко сооб­ще­ний о ком­ми­тах, сколь­ко нуж­но. Един­ствен­ное тре­бо­ва­ние для любо­го ком­ми­та: он дол­жен вклю­чать в себя, по край­ней мере, один файл и сооб­ще­ние. Пере­да­ча дан­ных (или push) долж­на иметь как мини­мум один коммит.

Про­дол­жая рабо­ту с при­ве­ден­ным ранее при­ме­ром, создай­те сооб­ще­ние для коммита:

user@host ~/git/testing $ git commit -m "Initial Commit" -a
[master (root-commit) 1b830f8] initial commit
0 files changed
create mode 100644 file

Выше­при­ве­ден­ная коман­да содер­жит два важ­ных пара­мет­ра. Пер­вый – это пара­метр –m, кото­рый поз­во­ля­ет набрать ком­мен­та­рий к ком­ми­ту (в дан­ном слу­чае Initial Commit). Вто­рой – это пара­метр –а, кото­рый озна­ча­ет, что дан­ное сооб­ще­ние о ком­ми­те нуж­но при­ме­нить ко всем добав­лен­ным или изме­нен­ным фай­лам. Для пер­во­го ком­ми­та это при­ем­ле­мо; в целом же, реко­мен­ду­ет­ся ука­зы­вать опре­де­лен­ные фай­лы или ката­ло­ги для каж­до­го коммита.

Так­же мож­но выполнить:

user@host ~/git/testing $ git commit -m "Initial Commit" file

Что­бы ука­зать опре­де­лен­ный файл ком­ми­та. Что­бы ука­зать допол­ни­тель­ные фай­лы или ката­ло­ги, вне­си­те в конец этой коман­ды спи­сок нуж­ных фай­лов, раз­де­лен­ный пробелами.

Передача изменений на удаленный сервер

До это­го момен­та все дей­ствия выпол­ня­лись на локаль­ном сер­ве­ре. Для про­сто­ты отсле­жи­ва­ния вер­сий фай­лов Git реко­мен­ду­ет­ся исполь­зо­вать локаль­но. Тем не менее, рабо­тая в коман­де раз­ра­бот­чи­ков, нуж­но пре­да­вать (или тол­кать) вне­сен­ные в код изме­не­ния на уда­лен­ный сер­вер. Об этом и пой­дет речь в этом разделе.

Пер­вое, что нуж­но для пере­да­чи кода на уда­лен­ный сер­вер — предо­ста­вить URL репо­зи­то­рия и назвать его.

Создаём аккаунт github

https://github.com/
авто­ри­зо­вы­ва­ем­ся, далее Your profile -> Repositories -> new
после созда­ния репо­зи­то­рия полу­ча­ем ссыл­ку вида:
git@github.com:midnight47/test2.git

Для кор­рект­ной рабо­ты долж­ны быть созда­ны ssh клю­чи пуб­лич­ный и приватный(создаём под поль­зо­ва­те­лем кото­рый будет работать)

далее добав­ля­ем пуб­лич­ный ключ в ваш github аккаунт:
Settings - SSH and GPG keys - New ssh key
зада­ём имя и добав­ля­ем ключ ~/.ssh/id_rsa.pub
на этом всё.

Что­бы настро­ить уда­лен­ный репо­зи­то­рий и про­смот­реть спи­сок всех таких репо­зи­то­ри­ев (если их более одно­го), вве­ди­те сле­ду­ю­щую команду:

git remote add test2 git@github.com:midnight47/test2.git

[midnight47@centos6 testg]$ git remote -v
test2 git@github.com:midnight47/test2.git (fetch)
test2 git@github.com:midnight47/test2.git (push)

Пер­вая коман­да добав­ля­ет уда­лен­ный репо­зи­то­рий по име­ни test2 и ука­зы­ва­ет URL ssh://git@github.com:midnight47/test2.git.

Конеч­но, мож­но ука­зать любое имя для уда­лен­но­го репо­зи­то­рия, но URL дол­жен ука­зы­вать на дей­стви­тель­ный репо­зи­то­рий. К при­ме­ру, что­бы толк­нуть код на GitHub, нуж­но исполь­зо­вать URL репо­зи­то­рия, предо­став­лен­ный проектом.

Когда уда­лен­ный репо­зи­то­рий настро­ен, мож­но при­сту­пать к пере­да­че кода.

Что­бы толк­нуть код в уда­лен­ный репо­зи­то­рий, наберите:

[midnight47@centos6 testg]$ git add .
[midnight47@centos6 testg]$ git commit -m "Initial Commit"
[master (root-commit) 7dc0b4e] Initial Commit
1 file changed, 2 insertions(+)
create mode 100644 test.t.txt

[midnight47@centos6 testg]$ git push test2 master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 216 bytes | 54.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:midnight47/test2.git
* [new branch] master -> master

 

Коман­да git push тол­ка­ет все изме­не­ния, test2 – это имя ново­го уда­лен­но­го репо­зи­то­рия, а master – имя пер­вой ветки.

Теперь для пере­да­чи кода в буду­щем мож­но про­сто наби­рать git push.

Использование веток git

Созда­дим две вет­ки («master» и «develop»), а так­же объ­еди­нить код от ста­дии раз­ра­бот­ки до про­из­вод­ства. Вет­ка – это, по сути, уни­каль­ная серия изме­не­ний кода с уни­каль­ным име­нем. Каж­дый репо­зи­то­рий может иметь одну или боль­ше вет­вей. По умол­ча­нию пер­вая ветвь назы­ва­ет­ся «master».

Просмотр ветвей

Преж­де чем созда­вать новую ветвь необ­хо­ди­мо про­смот­реть все суще­ству­ю­щие ветви.

Что­бы это сде­лать, вве­ди­те сле­ду­ю­щую команду:

git branch -a

Флаг «-а» в кон­це коман­ды гово­рит GIT о необ­хо­ди­мо­сти про­смот­реть все суще­ству­ю­щие вет­ви, вклю­чая те, кото­рых нет в локаль­ной рабо­чей области

Резуль­тат будет иметь при­мер­но такой вид:

* master
remotes/origin/master

Сим­вол звез­доч­ки перед «master»в пер­вой стро­ке выве­ден­ных резуль­та­тов ука­зы­ва­ет на теку­щую ветку.

Вто­рая стро­ка ука­зы­ва­ет на то, что на уда­лен­ном сер­ве­ре под назва­ни­ем «origin» так­же суще­ству­ет ветвь с име­нем «master».

Научив­шись про­смат­ри­вать вет­ви, попро­буй­те создать свою соб­ствен­ную ветвь.

Создание ветвей

Как гово­рит­ся в нача­ле этой ста­тьи, нуж­но настро­ить рабо­чую сре­ду (production) и сре­ду раз­ра­бот­ки (development).

Вет­ка по умол­ча­нию «master» для рабо­чей сре­ды уже суще­ству­ет, зна­чит, теперь нуж­но создать толь­ко вет­ку «develop» для сре­ды разработки.

Что­бы создать новую вет­ку под назва­ни­ем «develop», вве­ди­те следующее:

git checkout -b develop

При усло­вии, что вет­ки с таким име­нем еще не суще­ству­ет, резуль­тат будет иметь такой вид:

Switched to a new branch 'develop'

Если такая вет­ка уже суще­ству­ет, GIT выведет:

fatal: A branch named 'develop' already exists.

Меж­ду вет­ка­ми мож­но пере­клю­чать­ся при помо­щи коман­ды «git checkout»:

git checkout master

или:

git checkout develop

При усло­вии, что вет­ка, на кото­рую необ­хо­ди­мо пере­клю­чить­ся, суще­ству­ет, резуль­тат будет выгля­деть при­мер­но так:

Switched to branch 'master'

При попыт­ке пере­клю­чить­ся на несу­ще­ству­ю­щую вет­ку, к примеру:

git checkout nosuchbranch

GIT выве­дет:

error: pathspec 'nosuchbranch' did not match any file(s) known to git.

Теперь, имея несколь­ко веток, нуж­но научить­ся рабо­тать с ними.

В дан­ном слу­чае, вет­ка «develop» будет исполь­зо­ва­на для тести­ро­ва­ния изме­не­ний,  а вет­ка «master» — для их публикации.

Что­бы про­ил­лю­стри­ро­вать этот про­цесс, нуж­но вер­нуть­ся к вет­ке «develop»:

git checkout develop

Внесение изменений в ветку «develop»

В дан­ной вет­ке нуж­но создать пустой файл под назва­ни­ем «develop».

Он не будет суще­ство­вать до тех пор, пока не будет объ­еди­нен с вет­кой «master» (на сле­ду­ю­щем этапе).

touch develop

Теперь нуж­но ска­зать GIT о необ­хо­ди­мо­сти отсле­жи­вать новый файл.

Что­бы доба­вить файл «develop», введите:

git add develop

Выше­при­ве­ден­ный набор команд создаст пустой файл под назва­ни­ем «develop» и доба­вит его в GIT.

Дан­ный файл нуж­но так­же зафик­си­ро­вать, то есть, при­кре­пить файл к теку­щей вет­ке (сей­час это вет­ка «develop»).

git commit -m "develop file" develop

Теперь дан­ный файл суще­ству­ет на вет­ке «develop»; на вет­ке «master» его пока нет.

Теперь нуж­но убе­дить­ся, что «develop» явля­ет­ся теку­щей вет­кой. Для это­го вве­ди­те следующее:

git branch

Выве­ден­ный резуль­тат выгля­дит так:

* develop
master

Как было ска­за­но ранее, сим­вол звез­доч­ки рядом с име­нем вет­ки ука­зы­ва­ет на теку­щую ветку.

Коман­да «ls» пока­жет, что суще­ству­ет два файла:

ls

Выве­ден­ный резуль­тат под­твер­дит, что оба фай­ла (под назва­ни­ем «file» и «develop») найдены:

develop file

Слияние кода между ветвями

Теперь необ­хо­ди­мо пере­клю­чить­ся на вет­ку «master», что мож­но сде­лать при помо­щи коман­ды «git checkout»:

git checkout master

Что­бы убе­дить­ся, что вет­ка «master» явля­ет­ся теку­щей, вве­ди­те следующее:

git branch

Сим­вол звез­доч­ки ука­жет на теку­щую ветку:

develop
* master

Коман­да «ls» пока­жет, что ново­го фай­ла «develop» нет:

file

На самом деле, его про­сто нет в вет­ке «master», он нахо­дит­ся в вет­ке «develop».

Про­цесс пере­да­чи кода с одной вет­ки в дру­гую (часто со сре­ды раз­ра­бот­ки на рабо­чую сре­ду) назы­ва­ет­ся слиянием.

При сли­я­нии важ­но пом­нить о том, что теку­щей долж­на быть та вет­ка, с кото­рой нуж­но объединиться.

В дан­ном слу­чае нуж­но объ­еди­нить вет­ку «develop», на кото­рой нахо­дит­ся файл «develop», с вет­кой «master».

Учи­ты­вая, что вет­ка «master» уже явля­ет­ся теку­щей, все, что нуж­но сде­лать –  запу­стить коман­ду «merge».

Одна из команд, кото­рую мож­но пере­дать коман­де «merge», – коман­да «—no-ff», кото­рая гово­рит GIT сохра­нить все сооб­ще­ния о ком­ми­тах до сли­я­ния. Это облег­чит отсле­жи­ва­ние изме­не­ний в будущем.

Что­бы объ­еди­нить изме­не­ния вет­ки «develop» с вет­кой «master», вве­ди­те сле­ду­ю­щую команду:

git merge develop --no-ff

Вывод коман­ды будет при­мер­но следующим:

Merge made by the 'recursive' strategy.
0 files changed
create mode 100644 develop

Коман­да «ls» под­твер­дит что файл «develop» теперь нахо­дит­ся на вет­ке «master»:

develop file

Послед­нее, что нуж­но сде­лать, — это пере­дать все изме­не­ния на уда­лен­ный сер­вер; это мож­но сде­лать при помо­щи коман­ды «git push»:

git push

 

Перемещение репозитория

К при­ме­ру, у вас есть репо­зи­то­рий, и его нуж­но залить на дру­гой адрес. Нуж­но сна­ча­ла ска­чать изме­не­ния вет­ки мастер, затем поме­нять адрес origin и залить его в по ново­му адрес.

Комит новой версию с тэгом

К при­ме­ру, вы выпу­сти­ли новую вер­сию про­дук­та 1.5.2. Что­бы ее заре­ли­зить, нуж­но выпол­нить сле­ду­ю­щую команду:

 

 

-----------------------------------------------------------------------------------------------------

При­ме­ры:
2 и более поль­зо­ва­те­лей на github
Созда­ём репо­зи­то­рий, после под поль­зо­ва­те­лем кло­ни­ру­ем его:
git clone git@github.com:midnight47/web.serv.sh.git
добав­ля­ем на github ключ:
~/.ssh/id_rsa.pub
пере­хо­дим в дирек­то­рию /home/user1/web.serv.sh
настраиваем:
git config user.name user1

git config user.email user1@example.ru

копи­ру­ем данные(наш про­ект), после добавляем
[user1@centos6 web.serv.sh]$ git add .

ста­вим ком­мент:
[user1@centos6 web.serv.sh]$ git commit -m "create" .
[master (root-commit) 1f5082e] create
1 file changed, 2173 insertions(+)
create mode 100644 webserv.skript.sh.05.05.18.sh

смот­рим туда ли будем грузить:
[user1@centos6 web.serv.sh]$ git remote -v
origin git@github.com:midnight47/web.serv.sh.git (fetch)
origin git@github.com:midnight47/web.serv.sh.git (push)

пушим:
[user1@centos6 web.serv.sh]$ git push
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 18.05 KiB | 1.20 MiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:midnight47/web.serv.sh.git
* [new branch] master -> master

добав­ля­ем вет­ку для разработки:
[user1@centos6 web.serv.sh]$ git checkout -b develop
Switched to a new branch 'develop'

про­ве­ря­ем:
[user1@centos6 web.serv.sh]$ git branch
* develop
master

вно­сим изме­не­ния в файл, сохраняем,
далее добав­ля­ем:
[user1@centos6 web.serv.sh]$ git add webserv.skript.sh.05.05.18.sh

ком­мен­тим:
git commit -m "test develop" webserv.skript.sh.05.05.18.sh
[develop 826552e] test develop
1 file changed, 1 insertion(+)

пушим, при этом будет созда­на новая вет­ка на github:
[user1@centos6 web.serv.sh]$ git push --set-upstream origin develop
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 558 bytes | 279.00 KiB/s, done.
Total 6 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 1 local object.
To github.com:midnight47/web.serv.sh.git
* [new branch] develop -> develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.

теперь при вне­се­нии изме­не­ний в файл пушим сле­ду­ю­щим обра­зом:
[user1@centos6 web.serv.sh]$ git add webserv.skript.sh.05.05.18.sh
[user1@centos6 web.serv.sh]$ git commit -m "dobalil stroky test" webserv.skript.sh.05.05.18.sh
[develop 41fa836] dobalil stroky test
1 file changed, 1 insertion(+)

[user1@centos6 web.serv.sh]$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 303 bytes | 303.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:midnight47/web.serv.sh.git
5928798..41fa836 develop -> develop

добав­ля­ем вто­ро­го поль­зо­ва­те­ля:
adduser user2

созда­ём ключ:
ssh-keygen -t rsa -b 4096

добав­ля­ем на гит­хаб новый ключ
cat .ssh/id_rsa.pub

кло­ни­ру­ем репозиторий:
git clone git@github.com:midnight47/web.serv.sh.git
Cloning into 'web.serv.sh'…
The authenticity of host 'github.com (192.30.253.113)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 12 (delta 3), reused 12 (delta 3), pack-reused 0
Receiving objects: 100% (12/12), 18.80 KiB | 9.40 MiB/s, done.
Resolving deltas: 100% (3/3), done.

настра­и­ва­ем:
[user2@centos6 web.serv.sh]$ git config user.email "user2@example.com"
[user2@centos6 web.serv.sh]$ git config user.name "user2"

[user2@centos6 ~]$ cd web.serv.sh/

про­ве­ря­ем:
[user2@centos6 web.serv.sh]$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/develop
remotes/origin/master

пере­клю­ча­ем­ся на develop
[user2@centos6 web.serv.sh]$ git checkout develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
Switched to a new branch 'develop'
[user2@centos6 web.serv.sh]$ git branch
* develop
master

вно­сим изменения:
[user2@centos6 web.serv.sh]$ nano webserv.skript.sh.05.05.18.sh
[user2@centos6 web.serv.sh]$ git add webserv.skript.sh.05.05.18.sh
[user2@centos6 web.serv.sh]$ git commit -m "add test user2" webserv.skript.sh.05.05.18.sh
[develop 2b7ad0d] add test user2
1 file changed, 1 insertion(+)

пушим
[user2@centos6 web.serv.sh]$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 306 bytes | 306.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:midnight47/web.serv.sh.git
41fa836..2b7ad0d develop -> develop

смот­рим лог gita:

[user2@centos6 web.serv.sh]$ git log
commit 2b7ad0dfa83ccede2c10836d8978dd37414453e9 (HEAD -> develop, origin/develop)
Author: user2 <user2@example.com>
Date: Wed Jun 6 09:08:54 2018 -0400
add test user2

commit 41fa83600a2f20db57e8cb1b73e7b3576f35bfbc
Author: user1 <user1@example.ru>
Date: Wed Jun 6 08:55:12 2018 -0400

dobalil stroky test

commit 592879825f084fb3786149113bec746a033a6725
Author: user1 <user1@example.ru>
Date: Wed Jun 6 08:44:40 2018 -0400

komment develop

commit 826552ebda22b37e28cc35a419b5f59af076cfef
Author: user1 <user1@example.ru>
Date: Wed Jun 6 08:39:21 2018 -0400

test develop

commit 1f5082eb7574d431a1ba922f5df5669e3b62f6e0 (origin/master, origin/HEAD, master)
Author: user1 <user1@example.ru>
Date: Wed Jun 6 08:15:56 2018 -0400

create

пере­клю­ча­ем­ся на пер­во­го поль­зо­ва­те­ля и пере­хо­дим в ката­лог:
[user1@centos6 ~]$ cd web.serv.sh/

про­ве­ря­ем ветку:
[user1@centos6 web.serv.sh]$ git branch
* develop
master

смот­рим git log (в нём нет дан­ных вне­сён­ных поль­зо­ва­те­лем user2)

[user1@centos6 web.serv.sh]$ git log
commit 41fa83600a2f20db57e8cb1b73e7b3576f35bfbc (HEAD -> develop, origin/develop)
Author: user1 <user1@example.ru>
Date: Wed Jun 6 08:55:12 2018 -0400
dobalil stroky test

commit 592879825f084fb3786149113bec746a033a6725
Author: user1 <user1@example.ru>
Date: Wed Jun 6 08:44:40 2018 -0400

komment develop

commit 826552ebda22b37e28cc35a419b5f59af076cfef
Author: user1 <user1@example.ru>
Date: Wed Jun 6 08:39:21 2018 -0400

test develop

commit 1f5082eb7574d431a1ba922f5df5669e3b62f6e0 (origin/master, master)
Author: user1 <user1@example.ru>
Date: Wed Jun 6 08:15:56 2018 -0400

create

В локаль­ном репо­зи­то­рии отсут­ству­ют послед­ние изме­не­ния, име­ю­щи­е­ся в уда­лен­ном репо­зи­то­рии. Для реше­ния этой про­бле­мы надо выпол­нить коман­ду git pull, кото­рая ска­ча­ет послед­ние изме­не­ния из уда­лен­но­го репо­зи­то­рия и смер­жит их с ваши­ми локаль­ны­ми правками.

git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:midnight47/web.serv.sh
41fa836..2b7ad0d develop -> origin/develop
Updating 41fa836..2b7ad0d
Fast-forward
webserv.skript.sh.05.05.18.sh | 1 +
1 file changed, 1 insertion(+)

 

далее мож­но про­ве­рить git log

 

[user1@centos6 web.serv.sh]$ git log
commit 2b7ad0dfa83ccede2c10836d8978dd37414453e9 (HEAD -> develop, origin/develop)
Author: user2 <user2@example.com>
Date: Wed Jun 6 09:08:54 2018 -0400
add test user2

commit 41fa83600a2f20db57e8cb1b73e7b3576f35bfbc
Author: user1 <user1@example.ru>
Date: Wed Jun 6 08:55:12 2018 -0400

dobalil stroky test

commit 592879825f084fb3786149113bec746a033a6725
Author: user1 <user1@example.ru>
Date: Wed Jun 6 08:44:40 2018 -0400

komment develop

commit 826552ebda22b37e28cc35a419b5f59af076cfef
Author: user1 <user1@example.ru>
Date: Wed Jun 6 08:39:21 2018 -0400

test develop

commit 1f5082eb7574d431a1ba922f5df5669e3b62f6e0 (origin/master, master)
Author: user1 <user1@example.ru>
Date: Wed Jun 6 08:15:56 2018 -0400

create

 


созда­ние локаль­но­го репозитория:
добав­ля­ем пользователя
adduser git
пере­хо­дим в него
su git
созда­ём ключи:
ssh-keygen -t rsa -b 4096

созда­ём дирек­то­рию в кото­рой будет проект:
[git@centos6 ~]$ mkdir proekt_git

пере­хо­дим в создан­ную дирек­то­рию и ини­ци­и­ру­ем репо­зи­то­рий:
[git@centos6 ~]$ cd proekt_git

[git@centos6 proekt_git]$ git init
Initialized empty Git repository in /home/git/proekt_git/

настра­и­ва­ем:
[git@centos6 proekt_git]$ git config user.email "git@example.com"
[git@centos6 proekt_git]$ git config user.name "git"

копи­ру­ем наш проект
[root@centos6 ~]# cp webserv.skript.sh.05.05.18.sh /home/git/proekt_git/
[root@centos6 ~]# chown git:git /home/git/proekt_git/webserv.skript.sh.05.05.18.sh
[root@centos6 ~]# su git

доба­вим и заком­ми­тем:
[git@centos6 proekt_git]$ git add .
[git@centos6 proekt_git]$ git commit -m "нача­ло про­ек­та" webserv.skript.sh.05.05.18.sh
[master (root-commit) 802470b] нача­ло проекта
1 file changed, 2173 insertions(+)
create mode 100644 webserv.skript.sh.05.05.18.sh

сей­час мы на вет­ке master:
[git@centos6 proekt_git]$ git branch -a
* master

созда­дим вет­ку для раз­ра­бот­ки:
[git@centos6 proekt_git]$ git checkout -b develop
Switched to a new branch 'develop'

про­ве­ря­ем:
[git@centos6 proekt_git]$ git branch
* develop
master

вне­сём изменения:
[git@centos6 proekt_git]$ nano webserv.skript.sh.05.05.18.sh
[git@centos6 proekt_git]$ git add .
[git@centos6 proekt_git]$ git commit -m "изме­не­ния из вет­ки раз­ра­бот­ки" webserv.skript.sh.05.05.18.sh
[develop 0bda7d3] изме­не­ния из вет­ки разработки
1 file changed, 1 insertion(+)

доба­вим ssh ключ со   вто­ро­го аккаунта/сервера:
[root@centos62 .ssh]# scp ~/.ssh/id_rsa.pub git@192.168.1.150:~/.ssh/authorized_keys
git@192.168.1.150's password:
id_rsa.pub 100% 735 0.7KB/s 00:00

кло­ни­ру­ем про­ект для вто­ро­го поль­зо­ва­те­ля:
[root@centos62 ~]# git clone git@192.168.1.150:~/proekt_git
Cloning into 'proekt_git'…
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 1), reused 0 (delta 0)
Receiving objects: 100% (6/6), 18.38 KiB | 18.38 MiB/s, done.
Resolving deltas: 100% (1/1), done.

захо­дим в дирек­то­рию и смот­рим на какой мы вет­ке:
[root@centos62 ~]# cd proekt_git/
[root@centos62 proekt_git]# git branch
* develop

настра­и­ва­ем:
[root@centos62 proekt_git]# git config user.email "root@example.com"
[root@centos62 proekt_git]# git config user.name "root"

пра­вим файл, добав­ля­ем и ком­мен­тим:

[root@centos62 proekt_git]# nano webserv.skript.sh.05.05.18.sh
[root@centos62 proekt_git]# git add .
[root@centos62 proekt_git]# git commit -m "ком­мент со вто­ро­го сер­ве­ра" webserv.skript.sh.05.05.18.sh
[develop f10e46c] ком­мент со вто­ро­го сервера
1 file changed, 1 insertion(+)

 

на сер­ве­ре меня­ем вет­ку:
[git@centos6 proekt_git]$ git checkout master
Switched to branch 'master'
[git@centos6 proekt_git]$ git branch
develop
* master

на вто­ром кли­ен­те пушим:
[root@centos62 proekt_git]# git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 355 bytes | 355.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To 192.168.1.150:~/proekt_git
0bda7d3..f10e46c develop -> develop


теперь пра­вим дан­ные на мастере:
[git@centos6 proekt_git]$ nano webserv.skript.sh.05.05.18.sh

добав­ля­ем и комментим:
[git@centos6 proekt_git]$ git add webserv.skript.sh.05.05.18.sh
[git@centos6 proekt_git]$ git commit -m "тест 3"
[develop 35e95ff] тест 3
1 file changed, 1 insertion(+), 1 deletion(-)

что­бы эти дан­ные отоб­ра­зи­лись на вто­ром нашем аккаунте/сервере то в дирек­то­рии выпол­ня­ем коман­ду git pull :
[root@centos62 proekt_git]# git pull
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From 192.168.1.150:~/proekt_git
eec0187..cd5937c develop -> origin/develop
Updating eec0187..cd5937c
Fast-forward
webserv.skript.sh.05.05.18.sh | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)