Git:如何检出所有已删除的文件?

19
在git中,我熟悉使用git checkout -- [<paths>...]语法来检出已删除的单个文件(建议在执行git status时使用)。
要获取所有文件,可以创建列表,并将该列表作为参数提供给上述命令。
但是,当你只想要所有已删除的文件(即在当前工作目录中运行rm -rf并希望还原所有文件),生成该列表是不优雅的。
如何检出所有已删除的文件?

我在下面的答案中添加了我通常用来清除未跟踪文件的步骤。在执行git reset --hard之后,这非常方便 :) - Gayan
6个回答

24

生成这个列表并不是那么难:

git diff --no-renames --name-only --diff-filter=D

要使其适用于git checkout,请使用-zxargs -0

git diff --no-renames --name-only --diff-filter=D -z |
    xargs -0 git checkout --
请注意,使用git checkout -f -- .与上述方法非常不同,因为git checkout -f -- .将覆盖已修改但尚未添加到索引中的文件,而上述方法仅从索引中提取仍在索引中但不再位于工作树中的文件。 (如果您没有这样的修改文件,则git checkout -f -- .将起作用,但git checkout -- .也将起作用。)

1
要查找已删除的文件,请使用 filter=D,而不是 filter=R。 - Oli
@Oli:糟糕,是的,哎呀! - torek
因此,要检查已删除的文件:git checkout $(git diff --no-renames --name-only --diff-filter=D) - Klesun
1
@ArturKlesun:是的,只要文件名中没有空格(如果有,您需要做一些更高级的操作,以防止shell将“this file name has spaces”视为命名为“this”和“file”等五个文件。) - torek
@torek,你可以直接用git checkout -- .开始回答(不过我想知道它是否是递归的)。 - Pacerier
@Pacerier:这是一个递归的问题,但问题在于该问题要求仅检查已删除文件。运行git checkout -- .将复制每个文件的索引版本,擦除您在任何未添加到Git的文件中所做的所有工作。(当使用首次出现在Git版本2.23中的新git restore命令时,所有这些都会变得更加清晰。有一个“安全”的git checkout,现在可用作git switch,还有一个“如果我不小心就会摧毁所有我的工作”的git checkout,现在是git restore。) - torek

12

当您只想要所有已删除的文件(即在当前工作目录中运行 rm -rf 后,您希望恢复所有文件)

您希望:

git checkout-index -a

6
我通常会执行以下操作:
git checkout .

执行“git checkout”命令以查看更改后的内容。

git clean -fd

这将删除未跟踪的文件,f 表示文件,d 表示目录。

在第二步之前,您也可以进行干运行,方法如下:

git clean -fdn

这将列出要删除的文件和目录。
请参阅更多有关撤销更改的信息。

2

如果删除文件的更改尚未提交,您可以使用 git checkout -- .

如果删除文件的更改已经提交,您可以使用 git reset --hard HEAD~


2
我可以通过以下方法实现:

我能够做到这一点:

for f in $(git diff --no-renames --name-only --diff-filter=D);do git checkout -- $f ;done

0
命令git checkout --force似乎可以解决问题。--force选项的man页面说:“[--force选项]用于丢弃本地更改”。

来自git-checkout手册页面:

   -f, --force
       When switching branches, proceed even if the index or the
       working tree differs from HEAD. This is used to throw away 
       local changes.

       When checking out paths from the index, do not fail upon 
       unmerged entries; instead, unmerged entries are ignored.

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