8. Удаленные репозитории
Теоретические сведения
Современные проекты во многих случаях выполняются командой разработчиков. Для поддерживание согласованного состояния репозиториев команды обычно используется сервер, который хранить центральный репозиторий.
СКВ git содержит команды для согласования работы репозиториев (клонирование, синхронизация изменений и др.). Кроме того, специальные серверные системы СКВ на основе git, такие как, например, github.com, предоставляют дополнительные возможности по управлению рабочим процессом создания проекта.
Создание репозитория на серверах, таких как github.com, производится в web-интерфейсе. Как правило, такой интерфейс содержит в себе инструкцию, достаточную для того, чтобы работать с репозиторием.
Для создания копии репозитория на компьютере пользователя используется команда
git clone репозиторий
Эта команда создает в текущем каталоге папку с копией указанного в аргументе репозитория. В аргументе можно указать каталог либо локального репозитория, либо репозитория на сервере, доступного по протоколу http
, https
, git
или др. В случае использования репозитория на сервере может понадобится ввести логин и пароль пользователя.
После клонирования в репозитории будет присутствовать ссылка на удаленный репозиторий, которая по-умолчанию имеет имя origin
. Посмотреть список ссылок на удаленные репозитории можно с помощью команды
git remote
Используя различные ключи, с помощью этой команды можно добавлять (ключи add
), удалять (rm
) или переименовывать ссылки на удаленные репозитории.
После клонирования в репозитории будет присутствовать одна локальная (master
) и одна удаленная (remote-tracking) (remotes/origin/master
) ветка. Посмотреть список удаленных веток можно с помощью команды git branch
с ключом -r
, для просмотра всех веток используется ключи --all
.
Удаленные ветви представляют собой локальные копии веток из других репозиториев (которые обычно расположены на сервере).
Добавить удаленную ветку можно с помощью команды, аргументом которой является имя ветки в репозитории origin
:
git checkout удаленная_ветка
Удалить удаленную ветку (точнее, локальную копию удаленной ветки) можно с помощью обычной команды для работы с ветками ( git branch -d
).
В процессе работы на сервере могут появиться новые коммиты. Для синхронизации локальной копии с удаленной веткой используется команда
git fetch [удаленная_ветка]
Схематично, работа этой команды приведена на рисунке 6.
Рисунок 6 – Команды для работы с ветками
По-умолчанию синхронизируется ветка remotes/origin/master
.
С коммитами удаленной ветки нельзя работать напрямую, с помощью обычных команд git. Для того чтобы работать с загруженными в процессе синхронизации коммитами нужно провести слияние удаленной ветки с локальной. Сделать это можно с помощью обычной команды для слияния веток git merge
.
Операции синхронизации ветки и ее слияния часто запускаются одна за другой, поэтому для запуска их последовательного выполнения в git имеется специальная команда:
git pull
Эта команда загружает с сервера и добавляет новые коммиты в ветку master
. Использовать ее рекомендуется осторожно, поскольку возможны ошибки как на этапе загрузки коммитов в локальную копию удаленной ветки, так и на этапе слияния веток.
Обратная операция по загрузке коммитов из локальной ветки master
в его серверную копию не разделяется на части, а выполняется одной командой
git push [репозиторий] [локальная_ветка]
При выполнении этой команды может возникать ошибка, связанная с тем, что с момента последней синхронизации в удаленной ветке на сервере добавлены коммиты. Исправить эту ошибку можно двумя способами.
Во-первых, можно выполнить синхронизацию и слияние веток, после чего повторно выполнить команду git push
.
Во-вторых, можно выполнить команду git push -f
. Ключ -f
(от слова force) приведет к удалению с сервера коммитов, появившиеся после последней синхронизации, и выложит на сервер коммиты локальной ветви. Такой способ решения проблемы нужно применять с осторожностью, поскольку происходит удаление коммитов и может произойти потеря данных.
Задание к работе
Перед выполнением задания нужно уточнить адрес git-сервера, который используется при выполнении лабораторной работы в учебной аудитории.
В отчет по данной лабораторной работе нужно вставить скриншоты web-интерфейса серверной СКВ, включая скриншоты с содержимым файла репозитория после каждого пункта задания. После выполнения каждого пункта задания нужно выполнить команды для просмотра состояния тех частей локальных репозиториев (дерева коммитов, индекс, файлы из рабочего каталога), которые могут измениться при выполнении этого пункта.
- Создайте на сервере репозиторий, назовите его транслитерацией своей фамилии.
- Клонируйте репозиторий на свой компьютер 2 раза в папки с именами
имя_one
иимя_two
, гдеимя
– транслитерация Вашего имени. - В репозитории
имя_one
сделайте коммит. Выложите его на сервер. Синхронизируйте удаленную ветку репозиторияимя_two
. Объедините эту ветку с локальной. - Сделайте по одному коммиту в репозиториях
имя_one
иимя_two
. Коммиты должны отличаться в одной строке. Выложите коммит репозиторияимя_one
на сервер. Синхронизируйте удаленную ветку репозиторияимя_two
. Выполните слияние. Разрешите возникший конфликт. Выложите результат на сервер.