git push: как отправить код в удалённый репозиторий Git
Когда вы создали коммиты локально, они существуют только на вашем компьютере. Чтобы поделиться кодом с командой или сохранить его в облаке (GitHub, GitLab, Bitbucket), нужна команда git push. Это один из важнейших шагов в ежедневной работе разработчика.
Что происходит при git push #
git push отправляет локальные коммиты в удалённый репозиторий. Git сравнивает историю коммитов локальной и удалённой ветки, находит коммиты, которых нет на сервере, и загружает их.
Локально: A ← B ← C ← D (новые коммиты C и D)
Удалённо: A ← B
После push:
Удалённо: A ← B ← C ← D
Базовый синтаксис #
git push [remote] [branch]
remote— имя удалённого репозитория (обычноorigin)branch— ветка для отправки
Основные варианты использования #
Простой push (если ветка отслеживается) #
Если ветка уже настроена на отслеживание удалённой:
git push
Явный push в конкретную ветку #
git push origin main
git push origin develop
git push origin feature/auth
Первый push новой ветки с настройкой отслеживания #
При первом push новой ветки используйте флаг -u (или --set-upstream):
git push -u origin feature/new-dashboard
# или
git push --set-upstream origin feature/new-dashboard
Флаг -u устанавливает связь между локальной и удалённой веткой. После этого в этой ветке достаточно писать просто git push.
Push всех веток #
git push --all origin
Что такое origin #
origin — это просто имя (псевдоним) вашего удалённого репозитория. Когда вы клонируете репозиторий через git clone, Git автоматически создаёт origin, указывающий на исходный URL.
# Посмотреть что такое origin
git remote -v
# origin [email protected]:username/project.git (fetch)
# origin [email protected]:username/project.git (push)
У вас может быть несколько remote: origin, upstream, backup и т.д.
Проверка перед push #
Хорошая практика — проверить, что именно будет отправлено:
# Посмотреть статус
git status
# Посмотреть коммиты, которых ещё нет на сервере
git log origin/main..HEAD --oneline
# Или разницу
git diff origin/main
Удаление удалённой ветки #
git push origin --delete feature/old-branch
# Или устаревший синтаксис:
git push origin :feature/old-branch
Push тегов #
# Отправить конкретный тег
git push origin v1.2.0
# Отправить все теги
git push origin --tags
Force push: переписываем историю #
В редких случаях нужно принудительно перезаписать удалённую ветку:
git push -f origin main
# или
git push --force origin main
Важно: force push переписывает историю на сервере. Если кто-то уже скачал эти коммиты — у него возникнут конфликты. Никогда не делайте force push в общие ветки (main, develop).
Более безопасный вариант: –force-with-lease #
git push --force-with-lease origin feature/my-branch
Этот вариант откажется от push, если удалённая ветка изменилась с тех пор, как вы последний раз делали git fetch. Это защищает от случайного затирания чужих коммитов.
Когда force push допустим:
- В личной feature-ветке, над которой работаете только вы
- После
git rebaseилиgit commit --amendв личной ветке - Исправление случайно закоммиченных секретов (после смены ключей!)
Обработка ошибок #
Rejected: outdated #
! [rejected] main -> main (fetch first)
error: failed to push some refs
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
Причина: на сервере есть коммиты, которых нет у вас. Решение:
git pull origin main # Получить обновления и слить
git push origin main # Теперь push пройдёт
Rejected: non-fast-forward #
Похожая ситуация, история разошлась. Решение то же: git pull.
Permission denied (publickey) #
[email protected]: Permission denied (publickey).
Причина: проблема с SSH-ключами. Решение: проверьте настройку SSH:
ssh -T [email protected]
Repository not found #
ERROR: Repository not found.
Причина: неправильный URL или нет доступа. Проверьте:
git remote -v # Проверить URL
Dry run: проверка без реального push #
git push --dry-run origin main
# Показывает, что будет сделано, не отправляя ничего реально
Лучшие практики #
Коммитьте часто с небольшими изменениями. Маленькие коммиты проще ревьюить и откатывать.
Делайте pull перед push. git pull перед git push снижает вероятность конфликтов.
Проверяйте перед push. git diff origin/main или git log origin/main..HEAD покажут что будет отправлено.
Не делайте force push в общие ветки. main, develop — это общие ветки. Force push здесь сломает работу всей команды.
Используйте --force-with-lease вместо --force. Это безопаснее.
Полный пример рабочего цикла #
# 1. Обновить локальную копию
git switch main
git pull origin main
# 2. Создать ветку для задачи
git switch -c feature/user-profile
# 3. Работать и коммитить
echo "profile code" > profile.js
git add profile.js
git commit -m "feat: add user profile page"
# 4. Проверить что будет запушено
git log origin/main..HEAD --oneline
# 5. Первый push с установкой отслеживания
git push -u origin feature/user-profile
# 6. Дальнейшие push'и — просто
git push
# 7. Создать Pull Request на GitHub (через веб-интерфейс или CLI)
# gh pr create --title "Add user profile" --body "..."
Часто задаваемые вопросы #
Что означает origin в команде git push origin main? origin — это имя (псевдоним) вашего удалённого репозитория. Обычно это URL на GitHub, GitLab или другой платформе. Можно посмотреть через git remote -v.
Чем отличается git push от git push origin main? git push использует настроенное отслеживание (upstream). git push origin main явно указывает куда и что отправить. Для первого push новой ветки нужно явно указать remote и ветку (или использовать -u).
Что делает флаг -u в git push -u origin main? Устанавливает связь между локальной и удалённой веткой. После этого git push и git pull будут знать, куда отправлять и откуда получать, без дополнительных аргументов.
Когда нужен force push и почему он опасен? Force push нужен после rebase или amend в личной ветке. Он переписывает историю на сервере, что сломает работу всех, кто уже скачал эти коммиты. Никогда не делайте force push в общие ветки.
Как отменить случайный push? Если никто ещё не скачал коммиты — git revert HEAD создаст отменяющий коммит и запушьте его. Если нужно убрать коммит полностью — git reset + force push в личной ветке.
Можно ли отправить определённый коммит, не отправляя остальные? Да: git push origin <хеш>:main отправит до указанного коммита. Но обычно проще работать с ветками.
Заключение #
git push — финальный шаг в рабочем цикле разработчика. Освойте флаги -u для первого push ветки и --force-with-lease для безопасного force push. Всегда делайте git pull перед push, чтобы избежать rejected-ошибок.
Связанные команды: «git pull: как получить обновления» и «git commit: полное руководство».