假设我创建(但不提交)文件file.txt
,然后键入git checkout HEAD
或git checkout HEAD .
。我以为git checkout
基本上会在您提交的快照上用快照覆盖您当前的工作文件,所以我以为这会删除file.txt
。但事实并非如此。为什么?
答案 0 :(得分:1)
file.txt
对Git来说是“隐形”的,未被跟踪。如果您检出的提交中还有另一个名为file.txt
的文件,则该文件可以作为检出的副作用覆盖,但是Git不会竭尽全力地将其删除未跟踪的文件。
答案 1 :(得分:1)
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
最终删除未跟踪的文件。