Git и GitHub: remote, push, pull, clone и fork
Удалённый репозиторий — что это
Remote — это ссылка на репозиторий, который находится не на твоём компьютере. GitHub, GitLab, Bitbucket, или собственный сервер — всё это remote.
Git хранит remote как псевдоним + URL:
origin → https://github.com/ivan/my-project.git
upstream → https://github.com/original/my-project.git
origin — стандартное имя основного remote. Никакой магии — просто конвенция.
git remote
git remote add origin URL # добавить remote
git remote -v # показать все remote с URL
git remote remove origin # удалить
git remote rename origin new # переименовать
У одного репозитория может быть несколько remote. Типичная ситуация при работе с open source: origin — твой fork, upstream — оригинальный проект.
Tracking branches
После первого fetch или push Git создаёт tracking branches — локальные указатели на состояние удалённых веток:
origin/main → последний известный коммит на remote
main → твоя локальная ветка
origin/main не обновляется автоматически. Обновляется только при git fetch или git pull.
git log origin/main # история remote ветки
git diff main origin/main # твои изменения vs remote
push и pull
git push
git push origin main # отправить ветку main
git push -u origin main # + запомнить upstream для этой ветки
git push # после -u: без аргументов
Rejected push — когда remote опережает твой local:
! [rejected] main -> main (non-fast-forward)
Решение: git pull (забрать изменения) → разрешить конфликты если есть → git push.
Никогда не делай git push --force на shared ветки. --force-with-lease — безопаснее, отклонит push если remote изменился.
git fetch и git pull
git fetch origin # скачать, НЕ мержить в local
git pull origin main # fetch + merge (или rebase если настроено)
fetch безопаснее — ты видишь что пришло перед тем как мержить. pull удобнее, но мержит автоматически.
Лучшая практика:
git fetch origin
git log origin/main --oneline -10 # смотришь
git merge origin/main # решаешь сам
git clone
git clone https://github.com/user/repo.git
git clone URL folder # в конкретную папку
git clone --depth 1 URL # shallow: только последний коммит
Clone делает всё за тебя:
- Копирует репозиторий с историей
- Настраивает
origin→ URL - Создаёт tracking branch
После clone сразу можно работать — ничего не нужно настраивать.
Fork и Pull Request
Fork нужен когда у тебя нет прав пушить в репозиторий.
# 1. Fork на GitHub (кнопка)
# 2. Clone своего fork
git clone https://github.com/ТВОЙ/repo.git
# 3. Добавить upstream
git remote add upstream https://github.com/ОРИГИНАЛ/repo.git
# 4. Работать в ветке
git switch -c fix/my-fix
git commit -m "fix: ..."
git push origin fix/my-fix
# 5. Pull Request: твой fork → upstream
Обновление fork:
git fetch upstream
git merge upstream/main
git push origin main
SSH vs HTTPS
| | HTTPS | SSH | |---|---|---| | Настройка | Проще | Один раз настроить ключ | | Аутентификация | Токен при push | Автоматически по ключу | | Удобство | Нужно вводить/хранить токен | push/pull без паролей |
Для частой работы — SSH удобнее:
ssh-keygen -t ed25519 -C "email@example.com"
# Добавить ~/.ssh/id_ed25519.pub в GitHub Settings → SSH keys
Команды для ежедневной работы
git remote -v # список remote
git remote add origin URL # добавить remote
git push -u origin main # первый push ветки
git push # обычный push
git pull # fetch + merge
git fetch origin # только скачать
git clone URL # клонировать
git remote add upstream URL # добавить upstream
git fetch upstream # обновить из upstream