Skip to end of metadata
Go to start of metadata

Что такое система контроля версий, я думаю все знают (Wikipedia), так вот, git это распределенная (distibuted) система контроля версий, это значит, что нет такого понятия, как центральный сервер (репозиторий) и клиент, каждый git репозиторий - самодостаточный. У вас может быть всего один репозиторий (тот в котором вы работаете), но если вы работаете в команде, то возникает необходимость в синхронизации. Синхронизация осуществляется посредством удаленных репозиториев, которые, в зависимости от выбранной стратегии, являются либо репозиториями членов команды, либо отдельным репозиторием (назовем его главным). Работа с удаленным репозиторием состоит всего лишь в том, чтобы помещать либо получать данные из него. Это делается с помощью команд git push,git fetch и git pull о которых пойдет речь ниже.

Просмотр удаленных репозиториев

Если ваш репозиторий создан методом копирования уже существующего репозитория, то есть через git clone, то у вас уже есть один удаленный репозиторий с именем origin
Более подробную информацию по удаленному репозиторию, можно посмотреть с помощью команды:

git remote show origin # вместо origin можно подставить любое имя удаленного репозитория (если их у вас несколько)

Если же вы создавали репозиторий с помощью git init, то удаленных репозиториев у вас нет, в этом можно убедится выполнив команду:

git remote

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

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

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

git remote add %REMOTE_NAME% %REMOTE_URL%

где %REMOTE_NAME% это имя удаленного репозитория, а %REMOTE_URL% - его URL. Имя репозитория может быть любым, но если вы работаете только с одним удаленным репозиторием, правильно будет назвать его origin (считайте это правилом хорошего тона). URL репозитория - сетевой адрес, по которому находится репозиторий, но на самом деле, адресом может быть и путь в вашей файловой системе, то есть удаленный репозиторий может находится и на вашем компьютере. Продемонстрируем эту особенность на примере:

mkdir /tmp/my_remote && cd /tmp/my_remote # создаем директорию и переходим в нее
git init # создаем репозиторий
touch readme # добавляем пустой файл
git add readme # добавляем новый файл в git-индекс
git commit -m 'initial commit' # фиксируем изменения
cd /tmp
git clone /tmp/my_remote cloned_my_remote

Удаление и переименование удаленного репозитория

Удалить либо переименовать удаленный репозиторий очень просто, просто посмотрите синтаксис команд:

git remote rename origin my_remote_name # переименовываем origin в my_remote_name
git remote rm my_remote_name # удаляем my_remote_name

Получаем данные из удаленного репозитория

Получить данные из удаленного репозитория можно двумя разными командами git fetch и git pull

Поговорим подробней о каждой из них.

git fetch

git fetch забирает изменения из указанного удаленного репозитория:

git fetch origin # origin можно не указывать, git использует это имя по умолчанию

если нужно, то вы можете просмотреть более подробно, какие изменения вы получили с помощью команды git diff, или произвести слияние со своей активной веткой (то есть с вашей рабочей копией)

git merge origin/master

Отмечу, что git fetch забирает изменения всех веток удаленного репозитория, вы можете просмотреть их:

git diff HEAD origin/master # покажет отличия вашей рабочей копии с веткой master удаленного сервера origin
git diff HEAD origin/another_branch # покажет отличия вашей рабочей копии с веткой another_branch удаленного сервера origin

Таким же образом можно произвести слияние текущей ветки с любой из удаленных веток:

git merge origin/master
git merge origin/another_branch

git pull

Отличия этой команды от предыдущей в том, что после того, как git заберет изменения с удаленного репозитория, он автоматически попытается слить их с вашей текущей веткой:

git pull origin master

будет эквивалентно:

git fetch origin
git merge origin/master

Отправляем данные в удаленный репозиторий

Для этой цели используется команда git push.

git push origin master

Эта команда отправит данные из вашей ветки master в удаленный репозиторий origin в ветку master.

git push origin HEAD

Эта команда отправит данные из вашей текущей ветки в удаленный репозиторий origin в ветку с таким же названием как и ваша текущая (если такой ветки не окажется в удаленном репозитории, то она будет создана).

Есть еще варианты использования этой команды, но их описание, лучше отложить, пока достаточно запомнить этот вариант:

push origin master

Обратите внимание на то, что в случае когда с удаленным репозиторием работаете не вы один, и после того, как вы последний раз синхронизировали свой репозиторий с удаленным, в нем произошли изменения (например, кто-то другой отправил свои изменения), то git вам не позволит сделать push, пока вы не получите эти изменения и не объедините со своими.

вернутся к: Основы работы с Git