git reset
имеет три режима: «жесткий», «мягкий» и «смешанный», которые описывают, что происходит с рабочим деревом (т. Е. Вашими файлами) и областью подготовки.
--soft
оставляет и область подготовки, и ваши файлы в одиночку. --hard
отменяет все изменения в области подготовки и файлах. --mixed
сбрасывает индекс, но оставляет рабочее дерево в покое.
Имея это в виду, давайте посмотрим на то, что вы сделали.
Допустим, ваш репо выглядит следующим образом.
A - B [master]
Вы совершаетеalert("Hello");
, который становится коммитом C.
A - B - C [master]
Вы фиксируете alert("Hello adam");
, который становится коммитом D.
A - B - C - D [master]
Вы запускаете git reset --soft HEAD~1
.HEAD~1
- это коммит C с alert("Hello");
.Таким образом, master
вернулся к фиксации C, отменив фиксацию alert("Hello adam");
.
Поскольку вы использовали --soft
, индекс и файлы останутся прежними.В файлах все равно будет написано alert("Hello adam");
, и вы увидите diff.Это дает вам возможность повторить коммит.
Вместо этого, если вы хотите пересмотреть непосредственно предыдущий коммит, используйте git commit --amend
.Это переписывает предыдущий коммит.В текущем состоянии с выписанным C и alert("Hello adam");
незафиксированным, вы можете git commit -a
переписать коммит C с вашим новым изменением.
A - B - C1 [master]
\
C
Старый C в конечном итоге будет собирать мусор.
В общем, если вы хотите пересмотреть предыдущий коммит, просто внесите свои изменения, а затем git commit --amend
внесите их в предыдущий коммит.Более сложное переписывание истории потребовало бы «интерактивного перебазирования».См. Rewriting History
в книге Pro Git для получения дополнительной информации.
Кстати, git --soft HEAD~1
является формой «повторить».Это позволяет вам отменить предыдущий коммит, сохранив его изменения, чтобы вы могли редактировать их и фиксировать их заново.Вот несколько полезных псевдонимов, облегчающих понимание этих команд.
[alias]
# Undo the last commit
undo = reset --hard HEAD^
# Undo the last commit, but leave its changes in the working copy
# so we can redit them.
redo = reset --soft HEAD^
# Throw out all changes
clear = reset --hard HEAD