Чем опасно переписывание истории в публичном репозитории
В прошлой главе, посвящённой истории, мы узнали, как изменять (amend) коммиты и сбрасывать (reset) ветки. Эти операции так или иначе переписывают историю коммитов. Хотя это абсолютно нормально для локальных веток и приватных репозиториев, при работе с публичными репозиториями и в команде это может привести к проблемам.
Представь: серия коммитов отправлена в публичный репозиторий. Твои коллеги забрали эти коммиты и начали работать поверх них. Если теперь вернуться назад и изменить (amend) или сбросить (reset) любой из этих коммитов, фундамент, на котором строится работа коллег, будет изменён.
В следующий раз, когда коллеги попытаются запушить свои изменения, они получат ошибку, потому что история их локальной ветки больше не совпадает с историей удалённой ветки. Им придётся вручную согласовывать разошедшиеся истории, а это может быть запутанным и неприятным процессом.
Золотое правило: никогда не переписывай публичную историю. Как только коммит запушён в публичный репозиторий, считай его высеченным в камне. Если нужно что-то исправить, используй git revert, чтобы создать новый коммит, который отменит изменения, вместо того чтобы пытаться модифицировать существующий.
Если без этого никак не обойтись (например, чтобы удалить случайно закоммиченные конфиденциальные данные), сначала обсуди это с командой. Убедись, что все забрали последние изменения и в курсе происходящего. Затем, после переписывания истории, всем придётся сбросить (reset) свои локальные ветки, чтобы они совпали с новой историей на удалённом сервере.
И ещё один момент: будь осторожнее с git push --force. Эта команда перезаписывает удалённую ветку твоей локальной веткой, игнорируя любые конфликты. Это всё равно что сказать: «Мне всё равно, что там на сервере, сделай всё точно так же, как в моей локальной ветке». Это может привести к тому, что коллеги потеряют свою работу, если они запушили коммиты, которых не было в твоей локальной ветке перед выполнением git push --force.
У --force бывают нормальные сценарии, но включай его только когда точно понимаешь последствия. Если сомневаешься, лучше использовать git push --force-with-lease. Эта команда хотя бы предупредит, если в удалённой ветке есть неожиданные изменения.
Пройди курс так, как задумано: порционное обучение, чёткий порядок и постепенное открытие статей в Gitопедии. В любой момент можно продолжить работу с настоящим Git прямо в VS Code, Cursor, Antigravity или Windsurf.
(требуется войти в аккаунт)