Remote: fetch, pull и push без магии
Remote - это другой репозиторий, с которым твой локальный Git обменивается историей. Обычно он живёт на GitHub, GitLab или внутреннем сервере компании.
Важно: remote - это не "облако файлов", а полноценный Git-репозиторий. У него тоже есть коммиты, ветки, теги и история. Твой локальный репозиторий умеет скачивать оттуда новые объекты и отправлять свои.
Локальный репозиторий и remote
Упрощённая схема:
твоя машина сервер
/root/project /srv/git/project.git
локальные ветки remote repository
main, dev main, dev
Связь между ними обычно называется origin. Это не магическое имя, а просто стандартное имя remote, которое Git создаёт при clone.
Посмотреть remote:
git remote
git remote -v
git remote -v показывает URL для fetch и push:
origin /srv/git/project.git (fetch)
origin /srv/git/project.git (push)
В реальном проекте вместо локального пути часто будет SSH или HTTPS URL:
git@gitlab.com:team/project.git
https://github.com/team/project.git
Bare repository
В лабораторной remote расположен как bare-репозиторий /srv/git/project.git.
Bare repository - это Git-репозиторий без рабочей директории. В нём нет обычных файлов проекта для редактирования, только служебные данные Git. Такие репозитории удобны как серверная точка обмена.
Обычный репозиторий:
project/
.git/
README.md
app.py
Bare repository:
project.git/
HEAD
objects/
refs/
config
Пользователь работает в обычном clone, а bare repo принимает push и отдаёт историю через fetch/clone.
git clone: получить репозиторий впервые
git clone создаёт локальную копию remote-репозитория:
git clone /srv/git/project.git /root/project
Команда делает сразу несколько вещей:
- создаёт директорию
/root/project; - скачивает историю;
- создаёт локальную ветку;
- добавляет remote
origin; - настраивает связь локальной ветки с remote-веткой.
После clone полезно проверить:
cd /root/project
git status
git remote -v
git log --oneline
Remote-tracking branches
После clone или fetch Git хранит у себя информацию о ветках remote. Они выглядят как origin/main, origin/dev.
Посмотреть все ветки:
git branch -a
Пример:
* main
remotes/origin/main
remotes/origin/dev
main - твоя локальная ветка. origin/main - локальная запись о том, где был main на remote во время последнего fetch.
origin/main не обновляется сам по себе каждую секунду. Чтобы получить свежую информацию, нужен git fetch.
git fetch: безопасно обновить информацию
git fetch скачивает новые коммиты, ветки и теги с remote, но не меняет текущую рабочую ветку.
git fetch origin
git branch -a
git log --oneline --graph --all --decorate
Разбор: git fetch origin скачивает новые объекты и обновляет remote-tracking ветки от remote origin, но не меняет текущие файлы. git branch -a показывает локальные и remote-tracking ветки, а git log --oneline --graph --all --decorate даёт компактную карту истории со всеми ветками и именами указателей.
Это безопасная команда для понимания ситуации. После fetch ты можешь посмотреть, что появилось на сервере, и только потом решить, делать merge, rebase или ничего не делать.
Например:
git log --oneline main..origin/main
покажет коммиты, которые есть в origin/main, но ещё не попали в локальный main.
git pull: fetch плюс интеграция
git pull - это не отдельная магия. По умолчанию это git fetch + git merge.
То есть команда сначала скачивает изменения, а потом пытается объединить remote-ветку с текущей локальной веткой.
git pull origin main
Почему pull иногда кажется страшным: он сразу меняет текущую ветку и working tree. Если история разошлась или есть конфликт, Git остановится в середине интеграции.
Хорошая привычка перед pull:
git status
git fetch origin
git log --oneline --graph --all --decorate
Сначала убедись, что working tree чистый, и посмотри, что изменилось у команды.
git push: отправить свои коммиты
git push отправляет локальные коммиты на remote:
git push origin main
Разбор:
origin- имя remote;main- ветка, которую отправляем.
Полная форма читается как “отправить мою локальную ветку main в remote origin”. Если локальная и удалённая ветка уже связаны через upstream, короткий git push делает то же самое для текущей ветки.
Если ты создал новую ветку dev, её можно отправить так:
git switch -c dev
echo "dev work" > dev.txt
git add dev.txt
git commit -m "add dev work"
git push origin dev
После push на remote появится ветка dev.
Часто используют -u, чтобы связать локальную ветку с remote-веткой:
git push -u origin dev
После этого, находясь на dev, можно писать просто:
git push
git pull
Git поймёт, с какой remote-веткой работать.
Push может быть отклонён
Если на remote появились новые коммиты, которых нет у тебя локально, push может быть отклонён:
rejected because the remote contains work that you do not have locally
Это защита от потери чужой работы. Обычно порядок такой:
git fetch origin
git log --oneline --graph --all --decorate
git pull origin main
git push origin main
Сначала забрать чужую историю и объединить её с локальной, потом отправить результат.
Проверка bare repo
В лабораторной иногда нужно убедиться, что push действительно попал в bare repo. Для этого можно выполнить Git-команду прямо против server-side репозитория:
git -C /srv/git/project.git log --oneline
Флаг -C говорит Git: перед выполнением команды перейти в указанную директорию. Поэтому git -C /srv/git/project.git log --oneline читает историю именно bare repo, не меняя текущую директорию shell.
Сохранить историю:
git -C /srv/git/project.git log --oneline > /root/bare_log.txt
Это не обычный рабочий сценарий разработчика, но полезно в учебной VM: так проверяется, что remote действительно получил коммит.
Полезные команды remote
| Команда | Что делает |
|---|---|
git clone URL DIR |
скачать репозиторий в новую директорию |
git remote -v |
показать remote и URL |
git fetch origin |
обновить remote-tracking ветки |
git branch -a |
показать локальные и remote-tracking ветки |
git pull origin main |
скачать и объединить origin/main с текущей веткой |
git push origin main |
отправить локальный main на remote |
git push -u origin dev |
отправить новую ветку и настроить upstream |
git log --oneline --graph --all --decorate |
увидеть локальную и remote-историю |
Если сомневаешься, начинай с git status, git remote -v, git fetch и git log --oneline --graph --all --decorate. Эти команды дают картину без лишнего риска.
