Восстановить прежнее состояние, сохранить неотслеживаемые файлы - PullRequest
2 голосов
/ 17 августа 2011

Мне нужно восстановить все файлы на локальном компьютере до более ранней версии и сохранить неотслеживаемые файлы такими, какие они есть. Я нашел этот файл отката к более ранней версии, используя Git и сделал сначала

git reset <hash>

Мои файлы были такими же, как и раньше, поэтому я сделал

git checkout <hash>

Это тоже не помогло. Затем я заметил, что в git log не отображаются ревизии, которые были сделаны после ревизии.

Я запутался, что делать, чтобы восстановить состояние предыдущей ревизии, какой-нибудь совет?

1 Ответ

10 голосов
/ 17 августа 2011

Обе команды 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>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...