通过管道 git diff 到 git checkout

问题描述 投票:0回答:2

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

git checkout filename

如果我

git
2个回答
35
投票

您不能为此使用管道。但是,您可以使用 Unix

xargs
:

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

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


3
投票

管道导致管道左侧命令的标准输出被用作管道右侧命令的标准输入。管道

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 --
的东西。这使用空字符 (
\0
) 来分隔文件名,并会导致检出已删除的文件。这适用于任何有效的文件名,包括包含空格和其他特殊字符的文件名。

© www.soinside.com 2019 - 2024. All rights reserved.