Здесь записана попытка разобраться и понять, что происходит при выполнении команды git reset --soft.
git reset --soft <СтарыйКоммит>
А происходит нечто странное (все нижеперечисленные изменения произойдут в локальном репозитарии):
1. Состояние файлов в рабочей директории не откатывается до состояния на указанный старый коммит. То есть, в рабочей директории никакого отката кода не производится. (В интернетах утверждают, что состояние файлов должно сброситься до указанного коммита. Но тогда непонятно, как так у людей получается: в идексе (см. далее) будут изменения, которые приводят файлы старого коммита в состояние коммита, на котором программист затеял процедуру reset-a. А значит, файлы в рабочей директории действительно не должны измениться после команды сброса).
2. В индексе (stages) появляются изменения, которые производились начиная с коммита, до которого был произведен откат, и кончая HEAD каким он был до выполнения команды reset. В общем, в индексе появляется дельта изменений, которые пользователь хотел "откатить". Здесь неясно, какое направление сделано у этих изменений. Варианта два:
- Это изменения, которые будучи применимы к коммиту <СтарыйКоммит> приведут код в самое свежее состояние (от которого мы и хотим избавиться)
- Это изменения, которые будучи применимы к самому свежему коду, откатят его до состояния <СтарыйКоммит> .
документация не проливает свет на этот вопрос, потому он остается открытым. По коственным данным, эти изменения больше похожи на вариант 1. Но тогда непонятно, к чему они должны применяться, если в рабочей директории код находится не в состоянии <СтарыйКоммит>.
3. Указатель HEAD откатится до коммита <СтарыйКоммит>. Команда git log станет проказывать историю до коммита <СтарыйКоммит>, но не дальше. Чтобы увидеть все коммиты, которые даже находятся после коммита, до которого откатился пользователь, нужна команда git log --all.
Вот в таком состоянии будет находиться репозитарий. Что разумного можно сделать в таком состоянии, мне пока не понятно.
* * *
Теперь возникает вопрос: как выйти из этого состояния? Как вернуться хотя бы до прежнего состояния со всеми изменениями, где HEAD соответствовал указателю ветки и находился на самом последнем изменении в ветке?
В этом поможет команда git pull. Однако, она может не сработать в случае, если какой-либо файл в рабочей директории был изменен с момента команды git reset --soft. В этом случае надо действовать по обстоятельствам, git будет подсказывать что надо выполнить.