如何将下面的2个git命令拼接成一个?

How to splice the following 2 git commands into one?

以下命令更改工作目录以及阶段:

git checkout <commit> <file>

以下命令不会触及工作目录,它只会更改阶段:

git reset <commit> <file>

我只想更改工作目录,但不想接触舞台。我可以使用以下命令执行此操作:

git checkout <commit> <file>
git reset <file>

我怎样才能用一条命令做到这一点?

最正确的答案是"you can't"。不过有两个简单的解决方法(好吧,第一个比第二个简单,第二个有点像 "you can"):

  • 使用git show,例如git show HEAD~3:path/to/foo.txt > path/to/foo.txt

    这里的缺点是,除了必须将文件 name/path 写入两次之外,show 命令不应用任何污迹过滤器。如果您没有任何污迹滤镜,那没什么大不了的。

  • 您可以在 git checkout 期间选择不同的 "index file"(暂存区),这样触及的阶段就不是您将用于下一次提交的阶段:

    GIT_INDEX_FILE=/tmp/dummy git checkout <commit> <path>

    这里的缺点是有点笨拙,你应该记得清理你的虚拟索引文件(假暂存区)。此外,以上假定 shell (sh/bash) 语法;您可能需要在其他 shell 中使用 env 程序或其他形式。