1. 什么是“丢弃”?
在git中,“丢弃”通常指删除尚未add到暂存区的文件。在丢弃文件之前,需要确认这些文件没有任何变更需要保留。
如果已经使用git add将文件添加到暂存区,则需要使用git reset来取消暂存,然后才能使用git checkout等命令来丢弃文件。
2. git checkout 命令
使用git checkout命令可以丢弃工作目录中尚未添加到暂存区的所有修改,效果等同于将工作目录恢复到上一次提交的状态。
运行以下命令可以放弃一个文件:
git checkout -- file
其中,file表示要丢弃的文件名,--表示后面跟的是文件名。
需要注意的是,这个命令会直接覆盖工作区中的文件,丢失的内容无法恢复。
2.1 git checkout -- 的原理
git checkout -- 命令的原理是使用Git仓库中存储的文件快照来覆盖工作目录中的文件。可以将Git存储库看作是一个巨大的键值对数据库,其中键是文件名,值是文件内容。每次提交都会添加一个文件快照到数据库,每个文件的快照都有一个唯一的SHA-1哈希。
当运行git checkout -- file命令时,Git会从上一个提交中提取file的内容,并使用它来替换工作目录中的文件。如果仓库中没有上一个提交(例如,一次都没有提交过),则无法执行此操作。
3. git clean 命令
使用git clean命令可以删除工作目录中没有被提交的文件和目录。此命令会不留痕迹地地删除文件,因此应该确保要删除的文件是没有用的。
使用以下命令可以列出将被git clean删除的文件和目录:
git clean -n
-n选项告诉git clean只列出要被删除的文件和目录,而不实际删除。
要真正删除这些文件和目录,请使用以下命令:
git clean -f
-f选项告诉git clean执行删除操作,并删除所有没有被提交的文件和目录。
3.1 git clean -n 的原理
运行git clean -n命令时,Git会搜索本地工作目录中的所有文件和目录,查找它们是否在.gitignore文件中列出。如果它们不在列表中,则被视为没有被提交,将被列出。
可以使用--exclude选项向git clean命令添加排除模式。这个选项需要一个逗号分隔的模式列表,用于排除不需要被删除的文件和目录。
4. 总结
在git中,可以使用git checkout命令丢弃还没有add到暂存区的文件。如果已经add到暂存区,则需要先使用git reset取消暂存,然后才能使用git checkout等命令丢弃文件。
另外,git clean命令可以删除工作目录中没有被提交的文件和目录。这个命令会不留痕迹地地删除文件,因此应该确保要删除的文件是没有用的。