git checkout 所有文件

175

如何从我的版本库中删除所有文件中的更改?

假设我在一个分支上并且进行了一些更改。 git status 返回"Changes not staged for commit"中的一组文件,我发现我想要删除所有文件中的这些更改。如何通过单个命令完成这个操作?

我知道我可以使用以下方式来仅检出一个文件:

git checkout -- <file>
我注意到单独使用git checkout --会返回所有未提交的文件列表。然而,我找不到一种类似于git checkout --all的方式来检出它们。
我查看了man git checkout,但没有找到任何有用的信息。我还看了Git:检出除一个文件之外的所有文件,尝试了git checkout .,但也没有起作用。
我需要通过循环遍历git checkout --输出来以编程的方式解决此问题吗?
5个回答

262
如果您在工作目录的根目录下,您可以执行git checkout -- .命令,以检出当前HEAD中的所有文件并替换本地文件。
您还可以执行git reset --hard命令来重置您的工作目录并替换所有更改(包括索引)。

如果我们重置到HEAD,这两个选项是等效的吗? - lucidbrot
17
不,这两者有一些不同。例如,git checkout -- . 只会将更改重置为索引的状态。因此,如果您已经将文件添加到索引中,它就会将其重置为该状态。另一方面,git reset --hard 还会丢弃索引,因此,例如,如果您已将未跟踪的文件添加到索引中(以开始跟踪它们),它们也会被删除。git checkout 还允许通过传递更具体的路径来部分恢复工作目录,这可能非常有用。 - poke
1
@vinaykumarreddy Git checkout双破折号的含义 - poke
4
嗨,Poke。我相信"git checkout -- ."无法起作用。我尝试了多个未暂存的更改。 - Aman
4
实现相同结果的其他命令有:git checkout --forcegit reset --hard - tjalling
显示剩余5条评论

15

我发现另一种有用的方法是:

git checkout <wildcard> 

例子:

git checkout *.html

更一般地说:

git checkout <branch> <filename/wildcard>

4
如果你的 shell 启用了 globbing,并且工作目录中存在未跟踪的文件,则在不对星号进行转义的情况下,操作将失败。你可以使用反斜线进行转义,例如 git checkout \*git checkout '*' - Josh Cooley
git checkout <branch> <filename/wildcard> 会将 head 移动到指定的 branch,但是会将第二个参数中的文件放入本地文件状态而不是分支状态。 - Timo
git checkout *.html 在大多数设置中不能用于子目录。 - Sk446
通配符在不同的操作系统上有不同的工作方式。如果你使用 Powershell 在 Windows 上,git checkout * 将递归检出,但是在运行 BASH 的 Linux 机器上则不能这样说。 - Kellen Stuart

4

当然,你可以使用硬重置:

git reset --hard

此外,我使用了一种简单的方法来指定模式:
git checkout `git ls-files -m | grep "some pattern"`

在这里,"some pattern" 可以是文件夹或文件名,也可以是文件扩展名。


1
  • 如果您在跟踪文件的基本目录位置,则git checkout .将起作用,否则它将无法正常工作。

0
如果您想在“任何地方”检出所有文件
git checkout -- $(git rev-parse --show-toplevel)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接