为什么 git checkout 不删除新文件?

Jac*_*k M 5 git version-control git-checkout git-reset git-clean

假设我创建(但不提交)一个文件file.txt,然后输入git checkout HEADgit checkout HEAD .。我认为git checkout基本上用您提供的提交时的快照覆盖了您当前的工作文件,所以我认为这会删除file.txt. 但事实并非如此。为什么?

And*_*nev 8

git checkout不会按设计覆盖您的工作副本。

\n\n

它的工作方式与此相同,git reset --hard但有一个重要的区别 -git checkout工作目录安全,因此它不会覆盖工作目录中的现有更改。实际上,它\xe2\x80\x99s有点聪明\xe2\x80\x89\xe2\x80\x94\xe2\x80\x89它尝试在工作目录中进行简单的合并。

\n\n

因此,如果您想放弃所有更改并仅从 HEAD 获取快照,请使用git reset --hard HEAD或只是git reset --hard替代。

\n\n

但甚至git reset --hard不会删除您未跟踪的文件。要删除未跟踪的文件:

\n\n
    \n
  • 跑步git clean --dry-run。它只是告诉您将删除哪些内容。这样做是因为清洁是一个危险的命令。
  • \n
  • 运行git clean --force以最终删除未跟踪的文件。
  • \n
\n\n

您可以在此处找到有关git checkout和 的更多详细信息,以及在此处找到有关清洁的更多详细信息。git reset

\n


che*_*ner 1

file.txt未被跟踪,对 Git 来说是“不可见的”。file.txt如果您签出的提交中存在另一个指定的文件,则它可能会被覆盖,作为签出的副作用,但 Git 不会不遗余力地删除未跟踪的文件。