Git:从提交中复制到工作目录

3
有没有一种git命令可以将文件从提交历史复制到工作目录,而不复制到暂存区?checkout会复制到两个地方。也许这种情况并不常见,不值得专门为其创建一个命令。我询问这个问题只是出于好奇,并非有特定的应用场景。

你如何使用 checkout?如果你使用的是 *nix,那么 git show <SHA1>:<FILE> > <FILE> 是否能满足你的需求? - Arkadiusz Drabczyk
4个回答

4
有没有一个git命令可以将文件从提交历史中复制到工作目录,而不会复制到暂存区?
没有这样的命令,但是您可以合成一个。通过使用 git showgit 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也适用,但我没有尝试过。

3

最简单的方法是使用 git reset 和 reflog:

首先,将提交(或分支)的文件系统状态应用到您的工作目录、暂存区和分支中。
git reset --hard [commit/branch]

然后,重置暂存区和分支到之前的状态,而不修改工作目录(默认为“--mixed”重置):
git reset HEAD@{1}

该提交的文件已在您的工作目录中,没有其他内容。请注意,如果在步骤 1 和步骤 2 之间修改了 HEAD,则 HEAD@{1} 可能不是正确的引用,您可以使用 git reflog 查找它。


1
你可以通过 git stash --keep-index 实现某些目标,它会储藏更改并保留索引。如果你想要的提交是 HEAD,则此方法适用于你。但它有一个副作用,就是储藏更改。
你可以定义一个别名来储藏并丢弃。

这并不会从提交中提取文件:正如您所提到的,它保持索引不变。因此,它与从顶层执行git checkout -- .具有相同的效果,或多或少。 - torek

0
git checkout HEAD -- files

或者

git checkout <commit_id> -- files

将文件从最新的提交复制到舞台和工作目录。


是的,但它也会将 HEAD 变为“HEAD 处于分离状态(detached at)”;除非你已经指定了文件 - 请参见 https://dev59.com/MFQK5IYBdhLWcg3wdPqI#51817015 - sdbbs

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