🐛 Типичные ошибки — Merge и rebase

К оглавлению урока

⚡ Топ ошибок

  • ⚠️ git reset --hard — безвозвратно удаляет изменения
  • ⚠️ git push --force на main — ломает историю у всей команды
  • ⚠️ rebase публичной ветки — нарушение золотого правила
  • Путаница reset и revert — используйте revert на публичных ветках

Ошибка 1: git reset --hard без резервной копии

Одна из самых распространённых причин потери работы.

⚠️ ОПАСНО: git reset --hard
git reset --hard HEAD~1 или git reset --hard <commit> безвозвратно удаляет ВСЕ изменения в рабочем каталоге и индексе — включая несохранённые правки файлов. После выполнения этой команды восстановление данных без внешних резервных копий невозможно.

Типичные сценарии потери данных:
— Запустили git reset --hard не разобравшись, что это сделает
— Перепутали ветку и сделали reset --hard на main
— Хотели «просто очистить» рабочий каталог, но удалили незакоммиченные изменения

Безопасные альтернативы:
git reset --soft HEAD~1 — откатывает коммит, сохраняет изменения в staging
git reset --mixed HEAD~1 — откатывает коммит, сохраняет изменения в рабочем каталоге
git stash — временно спрятать изменения перед reset
git revert — безопасная отмена через новый коммит

Ошибка 2: git push --force на публичной ветке

Возникает чаще всего после rebase, когда Git не позволяет обычный push.

⚠️ ОПАСНО: git push --force
git push --force (или git push -f) перезаписывает историю удалённого репозитория вашей локальной историей. Все разработчики команды, которые уже получили предыдущие коммиты, окажутся в ситуации, когда их локальная история расходится с удалённой. Это приведёт к:
— Невозможности выполнить обычный git pull
— Потере чужих коммитов, влитых после вашего последнего pull
— Конфликтам и путанице в истории проекта

Никогда не использовать git push --force на ветках main, master, develop и других ветках, с которыми работает команда.

Более безопасная альтернатива для защищённых публичных веток: git push --force-with-lease — отказывает, если удалённая ветка изменилась с момента вашего последнего fetch, что предотвращает перезапись чужих коммитов.

Ошибка 3: rebase публичной (общедоступной) ветки

Нарушение золотого правила rebase — самая дорогостоящая командная ошибка.

Что происходит: Вы выполняете git rebase на ветке main (или другой общедоступной ветке). Rebase создаёт новые коммиты с теми же изменениями, но другими хэшами. Ваша ветка «расходится» с удалённой.

Когда вы пытаетесь запушить, Git отказывает. Единственный способ отправить изменения — git push --force, что разрушает историю для всех.

Правило: Перед git rebase всегда спросите себя: «Кто-нибудь ещё работает с этой веткой?» Если да — используйте git merge.

Ошибка 4: Путаница между reset и revert

Ситуация Правильная команда Почему
Нужно отменить коммит на main (публичная ветка) git revert <hash> Создаёт новый коммит; история не меняется; команда видит отмену
Нужно отменить последний коммит на локальной ветке git reset --soft HEAD~1 Коммит отменяется; изменения остаются и можно исправить
Нужно полностью убрать последний коммит И изменения (личная ветка!) git reset --hard HEAD~1 Только если 100% уверены, что изменения не нужны и ветка локальная

Ошибка 5: git commit --amend после push

После того как коммит был запушен в удалённый репозиторий, git commit --amend изменяет его хэш (создаёт новый коммит). Это приведёт к расхождению с удалённой веткой, и Git откажет при следующем push.

# Плохой сценарий:
git push origin feature       # коммит ушёл на сервер
git commit --amend -m "Oops"  # изменяем хэш коммита
git push origin feature       # ОШИБКА: rejected, non-fast-forward

Правило: git commit --amend — только для коммитов, которые ещё не были запушены.