Назад: Шаг 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
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 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
To ../hello.git
2faa4ea..79f507c master -> master

Примечание: Мы должны были явно указать ветку master для отправки изменений. Это можно настроить автоматически, но я все время забываю нужные команды. Для более простого управления удаленными ветками переключитесь в «Git Remote Branch».
49. Извлечение общих изменений
Цели: Научиться извлекать изменения из общего репозитория.
Быстро переключитесь в клонированный репозиторий и извлеките изменения, только что отправленные в общий репозиторий.
Выполните:
Примечание: Сейчас мы находимся в репозитории 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-адресами и проверьте, сможете ли вы извлекать изменения из репозиториев друг друга.