繁体   English   中英

在 git 中将文件从舞台复制到工作目录

[英]Copying files from Stage to Working Directory in git

在 git 中,通常有不止一种方法可以做一件事。 广义上 git 有三个相关区域:工作目录、阶段(索引)和本地存储库。 git 中的每个命令通常都会将文件从这些区域之一移动/复制到其他区域。 虽然将文件从工作目录移动到阶段和存储库很常见,但我想知道如何将文件从阶段复制/移动到工作目录 我知道的一个命令是git checkout -- filename 这会丢弃对工作目录中该文件所做的更改,并将其替换为该文件的最后一个暂存版本。 我想知道是否还有不同的命令可以做同样的事情?

您可以使用以下命令取消暂存文件(将文件从暂存目录移回工作目录):

git restore --staged <file>

如果您在存储库上运行git status ,这是 git (version >= 2.23) 的建议方法。

运行git reset将删除您在索引(以及存储库中)中的更改,但会将它们保留在工作目录中

例如,假设您已将一些文本git add到文件并执行git add其添加到暂存区。 如果你现在运行:

git reset HEAD^

然后添加的文本将不会出现在暂存中(也不会出现在存储库中),但它仍然会出现在工作目录中。 但是,这与git checkout -- <file> ,因为此命令会将文件恢复到上次记录的状态并丢弃更改,而无法将其恢复。 这被认为是一个有风险的命令,所以在运行它时一定要知道你在做什么

在 git 中,通常有不止一种方法可以做一件事。

没错:Git 有大量工具,它们之间有重叠。

广义上 git 有三个相关区域:工作目录、阶段(索引)和本地存储库。

这也是事实。

git 中的每个命令通常都会将文件从这些区域之一移动/复制到其他区域。

我认为这有点夸大其词,因为许多 Git 工具都没有:例如, git branch只是操作分支名称, git tag只是操作标签名称,等等。 但是肯定有工具可以进行这种复制。

...我想知道如何将文件从舞台复制/移动到工作目录

在 Git 2.23 之前,用于此的工具有些分散和笨拙。

在 Git 2.23 中, git checkout命令被拆分为两个独立的、设计更好的工具: git switchgit restore git restore命令具有复制到索引/暂存区和工作树的工具。 这些可以单独使用一起使用。

git checkout命令只有一种从索引/暂存区复制到工作树的形式,就是你提到的一种:

我知道的一个命令是git checkout -- filename

git reset命令就像旧的(并且仍然存在) git checkout ,因为它做了太多的工作并且没有很好地打包,但它也可以从索引复制到工作树。 这里的问题是,要这样做,它必须首先从提交复制到索引。 (另外值得注意的是:它仅使用git reset --hard执行此操作,并且当您使用该模式时,您正在调整整个工作树,而不仅仅是单个文件。因此,该模式只有非常特定的用例,尽管它们'有点常见。)

git checkout-index命令可以从索引复制到工作树。 它不经常使用:它是一个所谓的管道命令,用于编写新的面向用户的工具。

git showgit cat-file命令可以提取任何内部对象,包括索引中的对象。 您可以使用命令行重定向,例如, git show :0:README.md > index-copy-of-README.mdgit cat-file -p :Makefile | wc -l git cat-file -p :Makefile | wc -l ,让您的任何常规工具处理数据。

如果您只想取消暂存特定文件,您可以使用

git rm --cached <file>. 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM