Модуль 6: Работа с удалёнными репозиториями
Подключим удалённый репозиторий, научимся получать и отправлять изменения, разберём upstream‑связь и протоколы.
Удалённые — это не «сервер где‑то там», а набор правил синхронизации ссылок и объектов между вашим локальным графом истории и графом на хостинге. Понимание ссылок и политик push/pull делает работу предсказуемой и безопасной.
6.1 Клонирование репозитория
Клонирование — это создание полной копии удалённого репозитория на вашем компьютере, включая всю историю коммитов.
# Клонирование по HTTPS
git clone https://github.com/user/repo.git
# По SSH (нужен настроенный SSH-ключ)
git clone git@github.com:user/repo.git
# Клонировать в конкретную папку
git clone https://github.com/user/repo.git my-project
# Shallow clone — только последние N коммитов (быстрее)
git clone --depth 1 https://github.com/user/repo.git
# Клонировать только одну ветку
git clone --branch develop --single-branch https://github.com/user/repo.git
После клонирования Git автоматически создаёт remote с именем origin и настраивает tracking для ветки main.
6.2 Управление удалёнными (remotes)
# Посмотреть список remotes
git remote -v
# origin git@github.com:user/repo.git (fetch)
# origin git@github.com:user/repo.git (push)
# Добавить remote
git remote add origin git@github.com:user/repo.git
# Добавить второй remote (например, для форка)
git remote add upstream https://github.com/original/repo.git
# Изменить URL
git remote set-url origin git@github.com:user/new-repo.git
# Переименовать remote
git remote rename origin main-remote
# Удалить remote
git remote remove old-remote
# Подробная информация о remote
git remote show origin
Типичный сценарий с форком: origin — ваш форк, upstream — оригинальный репозиторий. Вы пушите в origin, а из upstream получаете обновления.
6.3 Получение изменений: fetch и pull
fetch и pull — два способа получить изменения с сервера. Разница принципиальная.
# fetch — скачать объекты, НЕ менять рабочие файлы
git fetch origin
# Обновились remote-tracking ветки: origin/main, origin/develop...
# Ваш локальный код НЕ изменился
# Посмотреть, что нового
git log --oneline main..origin/main
# Вручную слить
git merge origin/main
# pull = fetch + merge (в одну команду)
git pull origin main
# pull с rebase (линейная история)
git pull --rebase origin main
# Настроить rebase по умолчанию для этого репозитория
git config pull.rebase true
Рекомендация: для начинающих безопаснее делать git fetch + git log, чтобы посмотреть изменения, а потом вручную git merge. Это даёт больше контроля.
6.4 Отправка изменений: push
# Первый push — с привязкой upstream (-u)
git push -u origin feature/login
# Теперь git push/pull без аргументов знают, куда пушить
# Обычный push
git push
# Push конкретной ветки
git push origin main
# Push всех веток
git push --all origin
# Push тегов
git push origin --tags
# Force push (ОПАСНО — переписывает историю на сервере!)
git push --force origin feature/my-branch
# Безопасный force push (откажет, если кто-то успел запушить)
git push --force-with-lease origin feature/my-branch
# Удалить удалённую ветку
git push origin --delete feature/old-branch
Правило: никогда не делайте --force в main/develop. Используйте --force-with-lease только для своих feature-веток после rebase.
6.5 Протоколы: SSH vs HTTPS
HTTPS
- Проще стартовать — работает через стандартные порты
- Требует логин/пароль или Personal Access Token (PAT)
- Можно настроить credential helper для кэширования
SSH
- Удобнее для постоянной работы — не нужно вводить пароль
- Требует генерации SSH-ключа и добавления его в GitHub/GitLab
- Безопаснее — ключ привязан к вашему компьютеру
# Генерация SSH-ключа
ssh-keygen -t ed25519 -C "your@email.com"
# Добавить ключ в ssh-agent
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
# Проверить подключение к GitHub
ssh -T git@github.com
# Hi username! You've successfully authenticated.
# Переключить существующий remote с HTTPS на SSH
git remote set-url origin git@github.com:user/repo.git
6.6 Tracking‑ветки
Локальная ветка может «отслеживать» удалённую (upstream). Это включает краткие push/pull и подсказки статуса (на сколько коммитов вы опережаете/отстаёте).
6.7 Refspec: правила сопоставления ссылок
Refspec определяет, какие refs переносятся при fetch/push (например, +refs/heads/*:refs/remotes/origin/*). Знание refspec важно для зеркалирования и тонкой настройки синхронизации.
6.8 Политика push: push.default
Настройка управляет поведением git push без аргументов (simple, current, upstream, matching). Рекомендуется simple для безопасности.
6.9 Prune и обслуживание ссылок
git fetch --prune удаляет локальные ссылки на удалённые ветки, которые были удалены на сервере. Полезно для гигиены репозитория.
6.10 Shallow и Partial clone
Shallow clone (параметры глубины) ограничивает историю для экономии времени/трафика. Partial clone и фильтры (promisor) позволяют отложенную загрузку больших файлов.
6.11 URL‑схемы и credential helpers
Форматы URL (SSH/HTTPS), хранение и кэширование учётных данных через credential helpers (Windows/MacOS keychain, менеджеры). Безопасность секретов — ключевой аспект работы с удалёнными.