Раздел «Язык Си».GitTutorial41:

Назад: Шаг 31-40

41. Изменение оригинального репозитория

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

41.01 Внесите изменения в оригинальный репозиторий hello

Выполните:

cd ../hello
# (You should be in the original hello repository now)

Примечание: Сейчас мы находимся в репозитории hello

Внесите следующие изменения в файл README:

ФАЙЛ: README

This is the Hello World example from the git tutorial.
(changed in original)

Теперь добавьте это изменение и сделайте коммит

git add README
git commit -m "Changed README in original repo"

41.02 Далее

Теперь в оригинальном репозитории есть более поздние изменения, которых нет в клонированной версии. Далее мы извлечем и сольем эти изменения в клонированный репозиторий.

42. Извлечение изменений

Цели: Научиться извлекать изменения из удаленного репозитория.

Выполните:

cd ../cloned_hello
git fetch
git hist --all

Примечание: Сейчас мы находимся в репозитории cloned_hello

Результат:

$ git fetch
From /Users/alex/Documents/Presentations/githowto/auto/hello
6e6c76a..2faa4ea  master     -> origin/master
$ git hist --all
* 2faa4ea 2011-03-09 | Changed README in original repo (origin/master, origin/HEAD) [Alexander Shvets]
* 6e6c76a 2011-03-09 | Updated index.html (HEAD, origin/style, master) [Alexander Shvets]
* 1436f13 2011-03-09 | Hello uses style.css [Alexander Shvets]
* 59da9a7 2011-03-09 | Added css stylesheet [Alexander Shvets]
* 6c0f848 2011-03-09 | Added README [Alexander Shvets]
* 8029c07 2011-03-09 | Added index.html. [Alexander Shvets]
* 567948a 2011-03-09 | Moved hello.html to lib [Alexander Shvets]
* 6a78635 2011-03-09 | Add an author/email comment [Alexander Shvets]
* fa3c141 2011-03-09 | Added HTML header (v1) [Alexander Shvets]
* 8c32287 2011-03-09 | Added standard HTML page tags (v1-beta) [Alexander Shvets]
* 43628f7 2011-03-09 | Added h1 tag [Alexander Shvets]
* 911e8c9 2011-03-09 | First Commit [Alexander Shvets]

На данный момент в репозитории есть все коммиты из оригинального репозитория, но они не интегрированы в локальные ветки клонированного репозитория.

В истории выше найдите коммит «Changed README in original repo». Обратите внимание, что коммит включает в себя коммиты «origin/master» и «origin/HEAD».

Теперь давайте посмотрим на коммит «Updated index.html». Вы увидите, что локальная ветка master указывает на этот коммит, а не на новый коммит, который мы только что извлекли.

Выводом является то, что команда «git fetch» будет извлекать новые коммиты из удаленного репозитория, но не будет сливать их с вашими наработками в локальных ветках.

42.01 Проверьте README

Мы можем продемонстрировать, что клонированный файл README не изменился.

$ cat README
This is the Hello World example from the git tutorial.

Как видите, никаких изменений.

43. Слияние извлеченных изменений

Цели: Научиться перемещать извлеченные изменения в текущую ветку и рабочий каталог.

43.01 Слейте извлеченные изменения в локальную ветку master

Выполните:

git merge origin/master

Результат:

$ git merge origin/master
Updating 6e6c76a..2faa4ea
Fast-forward
README |    1 +
1 files changed, 1 insertions(+), 0 deletions(-)

43.02 Еще раз проверьте файл README

Сейчас мы должны увидеть изменения.

$ cat README
This is the Hello World example from the git tutorial.
(changed in original)

Вот и изменения. Хотя команда «git fetch» не сливает изменения, мы можем вручную слить изменения из удаленного репозитория.

43.03 Далее

Теперь давайте рассмотрим объединение fetch & merge в одну команду.

44. Извлечение и слияние изменений

Цели: Узнать о том, что команда git pull эквивалентна комбинации git fetch и git merge.

Обсуждение

Мы не собираемся опять проходить весь процесс создания нового изменения и его извлечения, но мы хотим, чтобы вы знали, что выполнение:

git pull

действительно эквивалентно двум следующим шагам:

git fetch
git merge origin/master

45. Добавление ветки наблюдения

Цели: Научиться добавлять локальную ветку, которая отслеживает изменения удаленной ветки.

Ветки, которые начинаются с remotes/origin являются ветками оригинального репозитория. Обратите внимание, что у вас больше нет ветки под названием style, но он знает, что в оригинальном репозитории ветка style была.

45.01 Добавьте локальную ветку, которая отслеживает удаленную ветку

Выполните:

git branch --track style origin/style
git branch -a
git hist --max-count=2

Результат:

$ git branch --track style origin/style
Branch style set up to track remote branch style from origin.
$ git branch -a
style
* master
remotes/origin/HEAD -> origin/master
remotes/origin/style
remotes/origin/master
$ git hist --max-count=2
* 2faa4ea 2011-03-09 | Changed README in original repo (HEAD, origin/master, origin/HEAD, master) [Alexander Shvets]
* 6e6c76a 2011-03-09 | Updated index.html (origin/style, style) [Alexander Shvets]

Теперь мы можем видеть ветку style в списке веток и логе.

46. Чистые репозитории

Цели: Научиться создавать чистые репозитории.

Чистые репозитории (без рабочих каталогов) обычно используются для расшаривания.

Небольшое пояснение, что же все-таки означает «чистый репозиторий». Обычный git-репозиторий подразумевает, что вы будете использовать его как рабочую директорию, поэтому вместе с файлами проекта в актуальной версии, git хранит все служебные, «чисто-репозиториевские» файлы в поддиректории .git. В удаленных репозиториях нет смысла хранить рабочие файлы на диске (как это делается в рабочих копиях), а все что им действительно нужно — это дельты изменений и другие бинарные данные репозитория. Вот это и есть «чистый репозиторий».

46.01 Создайте чистый репозиторий

Выполните:

cd ..
git clone --bare hello hello.git
ls hello.git

Примечание: Сейчас мы находимся в рабочем каталоге

Результат:

$ git clone --bare hello hello.git
Cloning into bare repository hello.git...
done.
$ ls hello.git
HEAD
config
description
hooks
info
objects
packed-refs
refs

Как правило, репозитории, оканчивающиеся на «.git» являются чистыми репозиториями. Мы видим, что в репозитории hello.git нет рабочего каталога. По сути, это есть не что иное, как каталог .git нечистого репозитория.

47. Добавление удаленного репозитория

Цели: Добавить чистый репозиторий в качестве удаленного репозитория к нашему оригинальному репозиторию.

Давайте добавим репозиторий hello.git к нашему оригинальному репозиторию.

Выполните:

cd hello
git remote add shared ../hello.git

Примечание: Сейчас мы находимся в репозитории hello.

48. Отправка изменений

Цели: Научиться отправлять изменения в удаленный репозиторий.

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

Начнем с создания изменения для отправки. Отредактируйте файл README и сделайте коммит

ФАЙЛ: README

This is the Hello World example from the git tutorial.
(Changed in the original and pushed to shared)

Выполните:

git checkout master
git add README
git commit -m "Added shared comment to readme"

Теперь отправьте изменения в общий репозиторий.

Выполните:

git push shared master

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

Результат:

$ git push shared master
To ../hello.git
2faa4ea..79f507c  master -> master

IDEA! Примечание: Мы должны были явно указать ветку master для отправки изменений. Это можно настроить автоматически, но я все время забываю нужные команды. Для более простого управления удаленными ветками переключитесь в «Git Remote Branch».

49. Извлечение общих изменений

Цели: Научиться извлекать изменения из общего репозитория.

Быстро переключитесь в клонированный репозиторий и извлеките изменения, только что отправленные в общий репозиторий.

Выполните:

cd ../cloned_hello

Примечание: Сейчас мы находимся в репозитории cloned_hello.

Продолжите с…

Выполните:

git remote add shared ../hello.git
git branch --track shared master
git pull
cat README

50. Размещение ваших git репозиториев

Цели: Научиться настраивать git сервер для совместного использования репозиториев.

Есть много способов расшаривать git репозитории по сети. Вот быстрый способ.

50.01 Запуск git сервера

Выполните:

# (From the work directory)
git daemon --verbose --export-all --base-path=.

Теперь в отдельном окне терминала перейдите в ваш рабочий каталог

Выполните:

# (From the work directory)
git clone git://localhost/hello.git network_hello
cd network_hello
ls

Вы увидите копию проекта hello.

50.02 Отправка в Git Daemon

Если вы хотите совершить отправку в репозиторий Git Daemon, добавьте метку --enable=receive-pack к команде git daemon. Будьте осторожны, этот сервер не производит аутентификацию, поэтому любой может отправлять изменения в ваш репозиторий.

51. Расшаривание репозиториев

Цели: Научиться расшаривать репозитории по WIFI.

Посмотрите, запущен ли git daemon у вашего соседа. Обменяйтесь IP-адресами и проверьте, сможете ли вы извлекать изменения из репозиториев друг друга.