1. 概述

在 Git(Git指南)的工作目录中,可以包含不同类型的文件,如暂存区文件、未暂存文件和未跟踪文件。

在这个教程中,我们将学习如何丢弃工作目录中未暂存的变化。

2. 工作目录状态分析

以我们从 Git仓库 起始并克隆了一个项目为例,然后对工作目录进行了修改。

让我们检查一下工作目录的状态:

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   README.md
        modified:   gradle/maven-to-gradle/src/main/java/com/sample/javacode/DisplayTime.java

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        gradle/maven-to-gradle/src/main/java/com/sample/javacode/TimeZones.java

no changes added to commit (use "git add" and/or "git commit -a")

在这里,我们可以看到一些已修改但未暂存的文件,以及一个新添加的文件。

现在,使用 git add 暂存现有的 Java 文件,再次查看状态:

$ git add gradle/maven-to-gradle/src/main/java/com/sample/javacode/DisplayTime.java
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   gradle/maven-to-gradle/src/main/java/com/sample/javacode/DisplayTime.java

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   README.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        gradle/maven-to-gradle/src/main/java/com/sample/javacode/TimeZones.java

这里,我们可以看到工作目录中有三类文件:

  • 已暂存文件 - DisplayTime.java
  • 未暂存文件 - README.md
  • 未跟踪文件 - TimeZones.java

3. 删除未跟踪文件

未跟踪文件是指新添加到仓库但尚未添加到版本控制的文件。我们可以使用 clean 命令删除这些文件

$ git clean -df

-df 选项确保强制删除,并包括未跟踪的目录。运行此命令将输出被删除的文件:

Removing gradle/maven-to-gradle/src/main/java/com/sample/javacode/TimeZones.java

现在,再次检查状态:

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   gradle/maven-to-gradle/src/main/java/com/sample/javacode/DisplayTime.java

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   README.md

可以看到 clean 命令已从工作目录中移除了未跟踪文件。

4. 删除未暂存到提交的变化

现在,我们已经删除了未跟踪文件,剩下的是工作目录中的暂存和未暂存文件。我们可以使用 git checkout -- 命令移除所有未暂存到提交的变化

$ git checkout -- .

执行命令后再次检查状态:

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   gradle/maven-to-gradle/src/main/java/com/sample/javacode/DisplayTime.java

我们可以看到工作目录现在只包含暂存的变化。

5. 总结

在这篇教程中,我们了解了工作目录中可能包含暂存、未暂存和未跟踪的文件,这些文件尚未纳入 Git 版本控制。

我们还看到了如何使用 git clean -dfgit checkout -- 来从工作目录中移除所有未暂存的变化。