有没有一种git命令可以将文件从提交历史复制到工作目录,而不复制到暂存区?checkout会复制到两个地方。也许这种情况并不常见,不值得专门为其创建一个命令。我询问这个问题只是出于好奇,并非有特定的应用场景。
git show
和 git cat-file -p
命令,可以将 blob 对象复制到标准输出中。因此,只需写一次提交哈希值和两次路径名(一次用于查找 blob 哈希 ID,另一次用于重定向命令的输出),就可以得到您想要的结果。git cat-file -p $rev:$path > $path
或者:
git show $rev:$path > $path
.gitattributes
以及各种autcrlf和EOL修改器)。--textconv
参数,您可以让git cat-file
应用文本转换。这对于git show
也适用,但我没有尝试过。最简单的方法是使用 git reset
和 reflog:
首先,将提交(或分支)的文件系统状态应用到您的工作目录、暂存区和分支中。
git reset --hard [commit/branch]
然后,重置暂存区和分支到之前的状态,而不修改工作目录(默认为“--mixed”重置):
git reset HEAD@{1}
该提交的文件已在您的工作目录中,没有其他内容。请注意,如果在步骤 1 和步骤 2 之间修改了 HEAD,则 HEAD@{1}
可能不是正确的引用,您可以使用 git reflog
查找它。
git stash --keep-index
实现某些目标,它会储藏更改并保留索引。如果你想要的提交是 HEAD,则此方法适用于你。但它有一个副作用,就是储藏更改。git checkout -- .
具有相同的效果,或多或少。 - torekgit checkout HEAD -- files
或者
git checkout <commit_id> -- files
将文件从最新的提交复制到舞台和工作目录。
checkout
?如果你使用的是*nix
,那么git show <SHA1>:<FILE> > <FILE>
是否能满足你的需求? - Arkadiusz Drabczyk