Обе команды reset
и checkout
имеют несколько значений в зависимости от аргументов, и значения слегка смешаны.
- сброс:
- с аргументом ревизии: Устанавливает текущую ветвь вуказать на указанную ревизию и:
reset --soft <rev>
: оставить индекс и файлы без изменений reset --mixed <rev>
(это значение по умолчанию для rev): индекс отображает состояние при ревизии, нооставляет файлы нетронутыми reset --hard <rev>
: перезаписывает как индекс, так и файлы с указанным состоянием редакции.
- с аргументом пути: делает индекс содержащим проверенное содержимоеуказанные файлы, но не изменяют файлы на диске (= отменяет
git add
).
- извлечение:
- с аргументом ревизии: переключается на указанную ветку или ревизию,но сохраняет локальные модификации.Если какой-либо файл изменен и отличается между текущим HEAD и указанной ревизией, отказывается запускаться.
- с аргументом пути: Изменяет файлы, указанные в соответствии с индексом, то есть отменяет добавленные изменения.
Из этого следует, что:
git reset <rev>
git checkout <rev>
эквивалентно просто
git reset --mixed <rev>
и не изменяет состояние на диске,Вы должны были сделать:
git reset --hard <rev>
или
git checkout <rev>
, где первый изменил бы то, куда указывает текущее ветвление, а последний переключил бы ветви.Ни один из них не коснется неверсионных файлов.
Если вы уже сделали
git reset <rev>
и хотите получить эффект
git reset --hard <rev>
, просто следуйте за ним с
git checkout .
(форма pathspec вместо формы редакции).
Обновление: Обратите внимание, что
git reset --hard <rev>
сделает текущую точку ветвления равной <rev>
,так что это будет как коммиты после <rev>
никогда не случалось.Это называется «перемотка» и вызовет некоторые проблемы, если кто-то уже основал свою собственную работу на ветке, потому что в его истории все еще будут эти изменения.Если вместо этого вы хотите создать новый коммит, который отменяет все изменения, начиная с <rev>
, вы можете сделать:
git revert <rev>..
Эта команда создает новый коммит, который отменяет все изменения, сделанные в указанных коммитах.Это не может отменить слияние.Чтобы вернуться к содержимому ревизии до слияния и сохранить историю, вы можете попробовать:
git reset --mixed <rev>
git reset --soft HEAD@{1}
git commit
Первый сброс переместит индексы HEAD и , а второй сброс вернет HEAD туда, где он имеетбыла одна операция назад, так что после этого у вас есть индекс от <rev>
и HEAD назад, где он был.Так что теперь вы можете совершить.Рабочее дерево не будет изменено операцией.Вы можете либо git checkout .
впоследствии, либо просто сделать первый сброс --hard
, чтобы получить содержимое рабочего дерева также из <rev>
.