Почему git checkout не удаляет новые файлы?

Предположим, я создаю (но не фиксирую) файл file.txt, а затем набираю git checkout HEAD или git checkout HEAD .. Я думал, что git checkout в основном перезаписал ваши текущие рабочие файлы с помощью снимка при фиксации, которую вы ему даете, поэтому я подумал, что это удалит file.txt. Но это не так. Почему?


4
2 488
2

Ответы:

file.txt, не отслеживаемый, «невидим» для Git. Если в извлеченном коммите есть другой файл с именем file.txt, он может быть перезаписан как побочный эффект извлечения, но Git не будет изо всех сил удалять неотслеживаемые файлы.


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здесь и о чистке здесь.