Материал открыт для чтения

Войдите, чтобы сохранять прогресс и результаты.

Войти
Git: Основы

Remote: fetch, pull и push без магии

чтение ~7 минУрок 8 из 15

Remote: fetch, pull и push без магии

module git basics Image06

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. Эти команды дают картину без лишнего риска.

Материал изучен?

Войдите, чтобы сохранить прогресс и перейти к практической лаборатории.

Войти и продолжить