为什么&#34; git checkout <filename>&#34;仅适用于非分段文件?

时间:2017-09-20 15:27:19

标签: git git-checkout

如果我提交然后对文件foo进行更改,我可以git checkout foo撤消这些更改。如果我对foo进行了更改并将其添加到git add foo,那么git checkout foo不做任何事情(并且没有说什么)

这背后的原因是什么?

3 个答案:

答案 0 :(得分:3)

当你说

git checkout foo

没有其他参数,您告诉git将您工作树中的foo替换为索引中的foo。因此,如果你add编辑(即,使用 更新索引)所有对foo的更改,那么当然没有任何内容可用于此checkout命令。

退出更改的正常过程是首先reset(从HEAD提交更新索引)和然后使用checkout进行更新工作版本。

然后,您可以使用checkout从先前的提交中获取foo的版本

git checkout HEAD foo

这也很有效;由于它使用git status建议的命令进行非暂存和取消更改,因此两步法可能只是更广为人知。

答案 1 :(得分:0)

因为你可以取消它,然后检查出来:)

git reset <file>

git checkout <file>

不检查它们的原因是因为如果您在本地更改文件,然后想要更新到主分支,请覆盖您的工作和暂存文件。

答案 2 :(得分:0)

使用Git 2.23(2019年8月),您现在可以避免使用confusing git checkout command(处理文件或分支)和新的(仍在试验中的)git restore command

  

您可以同时还原索引和工作树(与使用 return view('page.pages', compact('A2')); 相同)

git-checkout
  

或更实用但更不易读的缩写形式:

git restore --source=HEAD --staged --worktree hello.c

这将同时恢复工作树临时区域(缓存)。