Вы отправили сломанный коммит в общий main — отмените его безопасно, не переписывая историю
Коммит, который вы уже git push-нули в общую ветку main, сломал сборку, и другие инженеры его забрали. Отмените его изменения, не переписывая и не удаляя ни одного опубликованного коммита и без force-push.
Ограничения: общая история должна остаться нетронутой (никакого reset, никакого push --force); исправление — обычный коммит, который коллеги получат простым git pull; хеш плохого коммита — a1b2c3d.
# main уже содержит отправленный плохой коммит a1b2c3d
git ???
Приведите последовательность команд, которая отменит его безопасно.
Добавьте обратный коммит через git revert a1b2c3d, затем git push. revert фиксирует обратный дифф плохого коммита новым коммитом: сломанное изменение отменяется, опубликованные коммиты на месте. История дополняется, а не переписывается — коллегам достаточно git pull, без force-push. reset или push --force — лишь для локальных коммитов.
- ✗Хвататься за
reset --hardиpush --forceна общей ветке - ✗Думать, что
revertудаляет коммит, а не добавляет обратный - ✗Править уже отправленный коммит через
commit --amend
- →Чем отличается revert merge-коммита и почему ему нужен флаг
-m? - →Когда переписывание истории через
resetвсё же допустимо?
Решение
git revert не удаляет коммит, а создаёт новый коммит с обратным диффом — так плохое изменение отменяется, а опубликованная история остаётся нетронутой.
git revert a1b2c3d # создаёт новый коммит, отменяющий a1b2c3d
git push # обычный push, force не нужен
коммит; исходный коммит остаётся в истории.
остальных — это допустимо только для локальных, неопубликованных коммитов.
revertвычисляет обратный дифф коммитаa1b2c3dи фиксирует его как новый- Раз история дополняется, а не переписывается, коллегам достаточно
git pull. reset --hard+push --forceпереписали бы общую историю и сломали копии всех
Если открывается редактор сообщения, передайте --no-edit, чтобы принять сообщение revert-коммита по умолчанию.