Git

Модуль 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, менеджеры). Безопасность секретов — ключевой аспект работы с удалёнными.

Настройки

Цветовая схема

Тема