管git diff到git checkout

时间:2016-02-12 12:20:03

标签: git

如果我删除了一个文件,我可以用git恢复它:

git checkout filename

如果我想还原所有已删除的文件,我可以将它们列为:

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

我当时想要做的就是恢复它们,但是

git diff --diff-filter=D --name-only | git checkout

不起作用,它只重复列表到标准输出,并且git checkout似乎没有输入。同上| git checkout HEAD - 等等。

我已经在Windows命令提示符,Powershell和Git Bash中尝试了这一点,每次都有相同的结果。

如何正确管道输入到git checkout?

2 个答案:

答案 0 :(得分:10)

您无法使用管道。但是,您可以使用 Unix ' xargs

git diff --diff-filter=D --name-only | xargs git checkout

xargs是一个从stdin读取并将行作为参数放在其自己的参数旁边并调用结果的工具。因此,如果git diff生成行a和行bxargs git checkout将 - 至少在概念上 - 生成行git checkout a b并将其称为命令。

答案 1 :(得分:2)

管道导致管道左侧的命令的标准输出被用作管道右侧命令的标准输入。管道<div>导致git checkout | git diff --diff-filter=D --name-only命令的标准输出用作git checkout命令的标准输入。 git diff --diff-filter=D --name-only命令不使用标准输入,因此会忽略git diff输出,并最终得到git checkout命令的输出。

相反,请尝试git diff之类的内容。这使用空字符(git ls-files --deleted -z | xargs -0 git checkout HEAD --)来分隔文件名,并将导致检出已删除的文件。这适用于任何有效的文件名,包括包含空格和其他特殊字符的文件名。