push и pull: синхронизация с remote
Подключили remote — теперь учимся синхронизировать изменения в обе стороны.
git push — отправить коммиты
git push origin main # отправить ветку main в origin
git push -u origin main # то же + запомнить связь
git push # после -u: просто git push без аргументовФлаг -u (или --set-upstream) нужен только один раз — при первом push новой ветки. После этого Git знает куда пушить.
git switch -c feature/search
# ...делаешь работу...
git push -u origin feature/search # первый push ветки
git push # все последующиеRejected push — отказ
! [rejected] main -> main (non-fast-forward)
hint: Updates were rejected because the remote contains work
hint: that you do not have locally.
Это означает: пока ты работал, кто-то уже запушил в remote. Твоя история и история remote разошлись.
Решение:
git pull origin main # забери изменения remote
# если конфликт — разреши
git push origin main # теперь push пройдётНикогда не делай git push --force на shared ветки (main, develop). Force push переписывает историю remote — коллеги потеряют свои коммиты.
git pull — получить изменения
git pull origin main # fetch + merge
git pull # если upstream настроенgit pull = git fetch + git merge. Это удобно, но бывает сюрпризом: сразу мержит, не давая посмотреть что пришло.
Безопасный вариант
git fetch origin # скачать, не мержить
git log origin/main --oneline # посмотреть что пришло
git diff main origin/main # увидеть разницу
git merge origin/main # смержить когда готовpull --rebase
git pull --rebase origin mainВместо merge-коммита переносит твои коммиты поверх remote. История получается линейной. Многие команды настраивают это по умолчанию:
git config --global pull.rebase trueПопробуй в симуляции
Нажми «+ локальный коммит», потом «git push». Потом «+ remote коммит» и посмотри что будет при push без pull.
Типичный рабочий день
# Начало дня — забрать изменения коллег
git switch main
git pull origin main
# Работаешь в своей ветке
git switch feature/my-task
git merge main # взять свежий main в свою ветку
# В конце дня — отправить
git push origin feature/my-taskКоманды
git push origin main # отправить
git push -u origin main # отправить + запомнить upstream
git push --force-with-lease # force push (безопасный вариант)
git pull # fetch + merge
git pull --rebase # fetch + rebase
git fetch origin # только скачать
git fetch --all # со всех remotef0e1d2c4b5c6d7a3f7c21← pull
f0e1d2c4b5c6d7a3f7c21