应该git checkout绕过索引并且只更新工作树吗?

时间:2018-05-15 17:32:00

标签: git

来自the Atlassian docs

  

Git Checkout文件

     

签出文件类似于将git reset与文件路径一起使用,   除了它更新工作目录 *而不是   舞台。与此命令的提交级版本不同,这样做   不要移动HEAD参考,这意味着你不会切换   分支。

又向下一点:

  

如果 stage **并提交签出文件,则会“恢复”到该文件的旧版本。

然而,当我git checkout <sha1> -- <file>时,我看到更改添加到我的工作树(即,sublime更新中的文件) git status显示对文件的修改是绿色和分阶段/指数。 (由git diff验证,给出空输出。)

我的git配置错误,他们的文档不正确,还是我误解了?

*他们的重点

**我的重点

1 个答案:

答案 0 :(得分:1)

Atlassian文件在这里完全错误。

git checkout tree-ish -- path首先将指定的 path 复制到索引(也称为临时区域),然后从索引复制到工作树。这个覆盖以前索引中的任何内容。这里的 tree-ish 是Git文档意味着告诉你任何会找到提交或提交树对象的东西就足够了。大多数人在这里使用提交哈希ID,分支名称和相对名称,例如HEAD~3,但the gitrevisions documentation中的任何内容都足够了。

(要检查提交,checkout代码需要提交哈希,在这种情况下只需要提交ID。但是,对于这种特殊情况,它只需要找到源树快照提交ID相关联.Git可以像提交签出一样使用提交来查找树,但是您可以直接提供树哈希ID本身。几乎从来没有理由一个人来做这件事,但有些软件可能会这样做。另见the git rev-parse documentation。)

但请注意,git checkout -- path从索引复制到工作树(没有先从 tree-ish 中提取到索引)。这可能导致他们做出错误的假设。

使用git showgit cat-file -p 是一种直接从提交到工作树提取文件的方法,无需先通过索引。在旧版本的Git中,此过程始终会跳过任何行尾和其他过滤器和文本转换项,git checkout通常会为您执行此操作;在较新的Gits中,您可以按照git checkout的方式强制执行这些转换。只有在使用涂抹过滤器ident过滤器或CRLF行结束转换选项时,此警告才有意义。