ChatGPT解决这个技术问题 Extra ChatGPT

git checkout 所有文件

如何摆脱存储库所有文件中的所有更改?

假设我在一个分支中,我做了一些更改。 git status 在“未暂存以进行提交的更改”中返回一组文件,我注意到我想摆脱所有文件中的所有这些更改。如何使用单个命令执行此操作?

我知道我可以执行以下操作来仅签出一个文件:

git checkout -- <file>

我注意到仅 git checkout -- 会返回所有未提交文件的列表。但是,我找不到一种方法来检查所有这些,例如 git checkout --all

我检查了 man git checkout 并找不到任何东西。我也看到了 Git: Checkout all files except one 并尝试了 git checkout .,但也没有用。

我是否必须通过循环 git checkout -- 输出以编程方式执行此操作?


p
poke

如果您位于工作目录的根目录,则可以执行 git checkout -- . 以检出当前 HEAD 中的所有文件并替换您的本地文件。

您还可以执行 git reset --hard 来重置您的工作目录并替换所有更改(包括索引)。


这两个选项是否等效(如果我们重置为 HEAD)?
不,有一些差异。例如 git checkout -- . 只会重置对索引状态的更改。因此,如果您已经将文件添加到索引中,它将重置为。另一方面,git reset --hard 也会丢弃索引,例如,如果您将未跟踪的文件添加到索引中(开始跟踪它们),它们也会被删除。 git checkout 还允许您通过传递一个非常有用的更具体的路径来仅部分恢复工作目录。
@poke 嗨,Poke,我确定 git checkout -- 。不起作用。我尝试了多个未分阶段的更改。
实现相同结果的其他命令:git checkout --forcegit reset --hard
f
fedorqui

我发现有用的其他方法是:

git checkout <wildcard> 

例子:

git checkout *.html

更普遍:

git checkout <branch> <filename/wildcard>

如果在您的 shell 上启用了通配,并且工作目录中有未跟踪的文件,那么这将失败,除非您转义星号,例如 git checkout \*git checkout '*'
git checkout <branch> <filename/wildcard> 会将 head 移动到 branch 但将第二个参数中的文件放入本地文件状态而不是分支状态?
git checkout *.html 这不适用于大多数设置的子目录。
通配符的工作方式因您的操作系统而异。如果您在带有 Powershell 的 Windows 上,git checkout * 将递归检出,但对于运行 BASH 的 linux 机器则不能这样说。
B
Boris Davidov

当然你可以使用硬重置:

git reset --hard

此外,我正在使用允许指定模式的简单方法:

git checkout `git ls-files -m | grep "some pattern"`

所以这里的“一些模式”可能是文件夹或文件名或文件扩展名。


R
RayKim

如果您想在“任何地方”签出所有文件

git checkout -- $(git rev-parse --show-toplevel)

P
Prince Kumar

如果您位于跟踪文件的基本目录位置,则 git checkout 。将起作用,否则将不起作用