git checkout会更新暂存区吗?

4
暂存区可以通过git reset进行更新,但是否有任何情况下git checkout(或带有许多额外参数)会从新的HEAD更新暂存区呢? 更新:看起来git的行为取决于你是检出文件还是分支/提交。
  1. 如果没有指定文件,则将更新HEAD以指向/切换到给定的分支/提交,并且如果暂存区和工作树中有任何更改,则会发出警告并阻止切换。例如:git checkout DevBranch
  2. 如果指定了文件但没有分支/提交,则将指定的文件从暂存区复制到工作树中,不会触及暂存区(不会更新HEAD)。例如:git checkout file.txtgit checkout -- file.txt
  3. 如果同时指定了分支/提交和文件,则将在给定的分支/提交中更新暂存区和工作树中的指定文件(不会更新HEAD)。例如:git checkout DevBranch -- file.txt

2
在“Staged area can be updated via git reset”中,"updated"的意思是可以通过git reset来更新暂存区。 - MensSana
@Urbane 我的意思是在执行命令(git checkout)之后更改暂存区中的内容。 - Thomson
1个回答

7

当你在git checkout中指定分支或提交时,暂存区确实会更新,同时工作目录也会更新。例如:

git checkout master

将当前分支切换到master分支,并更新暂存区和工作目录。

git checkout head~1 myfile.txt

将位于head父级的myfile.txt版本复制到暂存区和工作目录中。如果您没有指定提交或分支,例如:
git checkout myfile.txt

那么 myfile.txt 的内容将会从暂存区复制到工作目录中;暂存区本身不会被改变。


如果在命令行中没有指定文件名,这个规则是否仍然适用? - Thomson
1
@Thomson - 是的;实际上,这是 git checkout 最常见的用法。当这种情况发生时,您将 HEAD 切换到指向另一个分支或提交,并且整个暂存区将更改以匹配该分支/提交。请注意,如果您没有指定文件名,并且您已对将被 git checkout 更改的文件进行了本地更改,则操作将失败,因此您不会丢失任何更改。当您_确实_指定文件名时,此保护措施不存在。 - David Deutsch
愚蠢的问题:文档是否指定了检出阶段文件?文档说:“它从索引文件或命名的<tree-ish>更新工作树中的命名路径”,并没有说太多其他的内容。 - Andreas Mueller
如果您查看 https://git-scm.com/docs/git-checkout 中“描述”部分的 git checkout <branch>,它会说:“为了准备在<分支>上工作,通过更新索引和工作树中的文件,并将HEAD指向该分支来切换到该分支。”(重点是我的)。 - David Deutsch

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