Как безопасно откатывать изменения в командной работе?
Откат изменений в командной работе требует осторожности — неправильный откат может затереть чужую работу или создать конфликты у всей команды. Вот безопасные подходы.
git revert — самый безопасный способ. Создаёт новый коммит, который отменяет изменения указанного коммита. История не переписывается, поэтому безопасен для общих веток. Команда git revert <commit-hash> откатывает один коммит. Можно откатить диапазон: git revert HEAD~3..HEAD создаст три revert-коммита. Если revert вызывает конфликты (код вокруг изменился), разрешите их как при обычном merge.
git reset — переписывает историю, используйте только для локальных веток или веток, которые никто не использует. git reset --hard <commit> перемещает указатель ветки назад и удаляет все изменения после этого коммита. Никогда не делайте reset --hard на ветках, отправленных в remote, если другие разработчики на них работают — это создаст расхождения.
git revert vs git reset: revert добавляет новый коммит отмены — безопасно для всех. reset удаляет коммиты из истории — безопасно только локально. Правило: если ветка в remote и кто-то мог сделать pull — используйте revert. Если ветка локальная или вы единственный разработчик — reset допустим.
Откат push: если вы уже сделали push нежелательных коммитов, используйте git revert, затем git push. Если нужно удалить коммиты из remote (например, случайно запушили секреты), сделайте git reset --hard <последний-хороший-коммит>, затем git push --force-with-lease. Предупредите команду — им придётся git fetch и git reset --hard origin/<branch>, потому что их локальная история больше не совпадает.
Восстановление случайно удалённых коммитов: git reflog показывает историю перемещений HEAD. Найдите хэш нужного коммита и выполните git reset --hard <hash> — коммит восстановится. Reflog хранит историю 90 дней по умолчанию.
Золотое правило: при сомнении — используйте revert, а не reset. Revert всегда безопасен, потому что он добавляет, а не удаляет.