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

时间:2018-08-27 17:00:06

标签: git version-control git-checkout git-reset git-clean

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

2 个答案:

答案 0 :(得分:1)

file.txt对Git来说是“隐形”的,未被跟踪。如果您检出的提交中还有另一个名为file.txt的文件,则该文件可以作为检出的副作用覆盖,但是Git不会竭尽全力地将其删除未跟踪的文件。

答案 1 :(得分:1)

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

它的工作方式与git reset --hard相同,但是有一个重要的区别-git checkout工作目录安全的,因此它不会覆盖工作中的现有更改目录。实际上,它比这要聪明一点-它试图在工作目录中进行琐碎的合并。

因此,如果您要放弃所有更改并仅从HEAD获取快照,请使用git reset --hard HEADgit reset --hard

但是,即使git reset --hard也不会删除您的未跟踪文件。要删除未跟踪的文件:

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

您可以找到有关git checkoutgit reset here以及清洁here的更多详细信息。