Предположим, я создаю (но не фиксирую) файл file.txt
, а затем набираю git checkout HEAD
или git checkout HEAD .
. Я думал, что git checkout
в основном перезаписал ваши текущие рабочие файлы моментальным снимком в фиксации, которую вы ему даете, поэтому я подумал, что это удалит file.txt
. Но это не так. Почему?
Почему git checkout не удаляет новые файлы?
Ответы (2)
git checkout
не перезаписывает вашу рабочую копию.
Он работает так же, как git reset --hard
, но с важным отличием: git checkout
безопасен для рабочего каталога, поэтому он не перезаписывает существующие изменения в вашем рабочем каталоге. На самом деле, он немного умнее — он пытается сделать тривиальное слияние в рабочем каталоге.
Итак, если вы хотите отменить все ваши изменения и просто получить снимок из HEAD, используйте вместо этого git reset --hard HEAD
или просто git reset --hard
.
Но даже git reset --hard
не удаляет ваши неотслеживаемые файлы. Чтобы удалить неотслеживаемые файлы:
- Выполнить
git clean --dry-run
. Он просто говорит вам, что будет удалено. Сделайте это, потому что очистка — опасная команда. - Запустите
git clean --force
, чтобы удалить неотслеживаемые файлы.
Вы можете найти более подробную информацию о git checkout
и git reset
здесь и об очистке здесь.
git reset --hard
не удаляет неотслеживаемые файлы, поэтому я исправил свой ответ.
- person Andrew Prigorshnev; 30.08.2018
file.txt
, будучи неотслеживаемым, является «невидимым» для Git. Если в извлекаемом коммите есть еще один файл с именем file.txt
, он может быть перезаписан как побочный эффект извлечения, но Git не станет удалять неотслеживаемые файлы.
git checkout .
или git checkout <ref>
? Я описывал последнее.
- person Sergio Tulentsev; 27.08.2018
git checkout HEAD .
- если я просто делаю git checkout HEAD
, он ничего не делает, но и не выдает явной ошибки (однако он выводит сообщение об изменении файла, что, я думаю, вы имеете в виду) .
- person Jack M; 27.08.2018
git checkout
не влияет на неотслеживаемые файлы. - person Sergio Tulentsev   schedule 27.08.2018git checkout
по-прежнему будет изменять файлы, которые отличаются от того, как они были в последнем коммите, даже если вы не внесли эти изменения. - person Jack M   schedule 27.08.2018git status
. Вы увидите новый файл в разделе Неотслеживаемые файлы. - person Sergio Tulentsev   schedule 27.08.2018git checkout
, так что в индексе прямо сейчас находятся те, что были в моментальном снимке. Но если вы измените индекс (например, наgit rm --cached
илиgit add
), это изменит набор отслеживаемых файлов. Заметьте также, чтоgit checkout <tree-ish> <paths>
сильно отличается от командыgit checkout <branch>
. Некоторые (включая меня) считают, что оно должно использовать другое написание, то есть вообще не начинаться сgit checkout
. - person torek   schedule 27.08.2018git checkout
ведет себя так по-другому :) - person Sergio Tulentsev   schedule 27.08.2018git clean
, я исправил свой ответ ниже. - person Andrew Prigorshnev   schedule 30.08.2018