Ответ 1
Из-за области подготовки, это не так просто, как svn revert
. В зависимости от того, что вы сделали, и какова ваша цель, вам нужно использовать либо git checkout
либо git reset
. Вы должны быть осторожны с git reset
, так как вы можете переписать историю и потерять работу.
Допустим, у вас есть граф коммитов:
A <-- B <-- C <-- D
И вы в настоящее время в D
с некоторыми изменениями. Чтобы просто отменить все изменения (ступенчатые или нет), вы можете использовать git reset --hard HEAD
или git reset --hard D
Оба сбросят состояние вашей рабочей копии.
Если вы хотите, чтобы состояние вашей рабочей копии было идентичным A
, но не потеряло коммиты B
и C
, вам следует использовать: git checkout A --.
с верхней части вашей рабочей копии. Это установит состояние вашей рабочей копии на содержимое A
На этом этапе ваше рабочее дерево загрязнено, поэтому вам необходимо зафиксировать факт того, что вы хотели вернуться назад. График коммитов на этом этапе будет:
A <-- B <-- C <-- D <-- A'
Где A'
- это новый коммит (с другим идентификатором), который возвращает вашу работу к эквиваленту коммита A
Если вы хотите потерять коммит B
и C
, вы можете использовать git reset --hard A
Это переместит указатель вашей ветки обратно для фиксации A
Вы сейчас переписываете историю, так что будьте осторожны. Если вы работаете с другими членами команды в этой ветке, вы не хотите этого делать. Если это ваша собственная ветвь, вам, вероятно, потребуется использовать git push -f
, где -f
означает --force
, при --force
его на удаленное репо. Вы также должны убедиться, что вы установили push.default
в current
или upstream
current
чтобы избежать нажатия всех соответствующих ветвей и случайного перемотки работы.
FWIW, я написал сообщение в блоге о возврате изменений в Git несколько лет назад. Это актуально и сегодня. Вы можете найти это полезным.