linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it works
  • Уроки
  • База знаний
  • Собеседование
home/git/kb/Удалённые репозитории/push

kb/remote ── Удалённые репозитории ── beginner

git push

Отправляет локальные коммиты в удалённый репозиторий и обновляет там ветку. Если remote получил коммиты от кого-то другого после твоего последнего pull - push откажется, пока не синхронизируешься.

view as markdownaka: git-push

git push синхронизирует локальные ветки с удалённым репозиторием. Это вторая половина пары «pull/push», без неё работа никому больше не видна.

Базовая форма

bash
git push                       # запушить текущую ветку в её tracking remote
git push origin main           # явно: ветку main в remote origin
git push origin feature:main   # запушить локальную feature в удалённую main
git push -u origin feature     # запушить и установить tracking

Флаг -u (--set-upstream) при первой отправке ветки делает её «связанной» с удалённой. После этого git push без аргументов будет знать, куда идти.

Что физически происходит

  1. Git собирает packfile из коммитов, которых нет на remote.
  2. Передаёт по сети (через SSH или HTTPS).
  3. Просит remote передвинуть его ref refs/heads/<branch> на новый SHA.
  4. Remote проверяет: можно ли fast-forward? Если да - двигает. Если нет - отказывает.

Отказ push'а

Самая частая ошибка:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'origin'
hint: Updates were rejected because the tip of your current branch is behind

Это значит: на remote есть коммиты, которых у тебя нет. Решение - либо git pull --rebase (затащить чужие коммиты, переписать твои поверх), либо git pull без rebase (создаст merge-коммит). После этого push пройдёт.

--force и --force-with-lease

Иногда нужно перезаписать историю на remote - например, после локального rebase. Для этого force-push.

bash
git push --force                  # опасный
git push --force-with-lease       # безопасный

--force слепо переписывает remote ветку, даже если кто-то другой только что туда что-то запушил - его коммиты молча пропадут.

--force-with-lease сначала проверяет: совпадает ли SHA remote ветки с тем, что Git видел в последний раз? Если нет - кто-то успел запушить, force отменяется. Это и есть тот вариант, который стоит использовать всегда вместо --force.

В main/master force-push обычно запрещён branch-protection правилами. Это правильно - общая история не должна переписываться.

Удаление удалённой ветки

bash
git push origin --delete feature
# или эквивалентно:
git push origin :feature

Второй вариант - старый синтаксис, видишь в скриптах. Семантика: «запушить пустоту в feature», то есть удалить.

Подводные камни

  • git push без -u при первой отправке требует явный origin <branch>. Без этого Git не знает, куда пушить.
    • Если remote называется не origin (например, upstream) - это надо указать явно или настроить tracking.
  • push отправляет только указанную ветку, не все локальные. Чтобы отправить теги отдельно - git push --tags или git push origin <tag>.

§ команды

bash
git push -u origin feature

Запушить и установить tracking

bash
git push --force-with-lease

Безопасный force-push (откажется, если remote ушёл вперёд)

bash
git push origin --delete feature

Удалить удалённую ветку

bash
git push --tags

Отправить все локальные теги

§ см. также

  • pullgit pullЗатаскивает обновления с удалённого репозитория и сразу сливает с текущей веткой. По сути - `git fetch` + `git merge` (или + `git rebase` с `--rebase`). Самая запутанная команда для новичков.
  • branchВетка (branch)Ветка в Git - это файл в `.git/refs/heads/`, в котором лежит SHA одного коммита. Создание, переключение и удаление веток тривиальны, потому что данных в ветке - 41 байт.
  • mergegit mergeСливает другую ветку в текущую. Делает либо fast-forward (двигает указатель), либо создаёт merge-коммит с двумя родителями. При пересекающихся изменениях возможны конфликты.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки