将git diff的输出导入到git checkout命令中

14

如果我删除了一个文件,我可以用以下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个回答

35

您不能使用管道来完成此操作。但是,您可以使用Unixxargs命令:

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

xargs 是一款从标准输入读取数据并将这些行作为参数与自身的参数组合后调用结果的工具。因此,如果 git diff 生成了行 a 和行 bxargs git checkout 至少在概念上会生成一行命令 git checkout a b 并调用它。


3
不使用xargs的替代方法:git checkout -- $(git diff --diff-filter=D --name-only | tr '\n' ' ')。该命令将筛选出被删除的文件,并将其传递给git checkout命令,以从工作目录中删除这些文件。 - Antonio Pérez
1
这两种解决方案都适用于Windows上的Git Bash。使用xargs版本可以在Windows命令提示符中正常工作,但使用$()的替代方法则不行。 - Roderick
我认为这是因为git bash基本上模拟了Linux bash shell。但是@AntonioPérez确实展示了一种不需要xargs依赖的好方法(尽管它需要tr或其他字符串处理工具,这也可能是一个弱点)。对于Antonio的评论点赞。 - Willem Van Onsem
1
@Starman:在管道符号前添加--relative参数。 - Willem Van Onsem
抱歉因为错误的编辑(已立即撤销)。 - VonC
显示剩余2条评论

3

管道符号将左边命令的标准输出作为右边命令的标准输入。以下管道命令 git checkout | git diff --diff-filter=D --name-onlygit checkout 命令的标准输出作为 git diff --diff-filter=D --name-only 命令的标准输入。由于 git diff 命令不使用标准输入,因此 git checkout 的输出被忽略,最终的输出结果为 git diff 命令的输出。

相反,尝试使用 git ls-files --deleted -z | xargs -0 git checkout HEAD -- 命令。该命令使用空字符 (\0) 分隔文件名,并使删除的文件被检出。该命令适用于任何有效的文件名,包括包含空格和其他特殊字符的文件名。


谢谢,我尝试了使用纯管道的两种方式,但结果相同。使用xargs解决方案有效。 - Roderick

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