为什么结帐有时会暂存文件?

时间:2015-03-03 16:44:38

标签: git git-checkout working-directory git-index git-stage

当我第一次开始使用Git时,我发现checkout命令很混乱。但是,当我适应Git的版本控制模型时,它开始变得有意义了。现在我不得不向同事教授Git,我正在努力解释checkout。我以为我有一个简单的解释(来自documentation):

  

签出一个或多个工作树的路径

这似乎统一了一些你可以用结帐做的事情,这对于Git的新手来说似乎是一系列不同的操作:

git checkout .
git checkout HEAD .
git checkout HEAD~2
git checkout feature/update-readme README.md

...除了最后一个,因为它不只是更新工作目录,而是分段文件。

我如何理解为什么或何时结帐会导致某些事情上演而不是仅仅复制到工作目录中?

2 个答案:

答案 0 :(得分:5)

git checkout实际上总是将所有签出的文件分段。但是如果您没有指定路径(如前三个示例中所示),您的HEAD也将设置为您签出的提交,因此您的阶段与您的HEAD相同,即没有提交更改。

答案 1 :(得分:1)

  

我怎么理解为什么或 何时 结帐会导致某些事情上演而不是仅仅复制到工作目录中?

从Git 2.21(2019年第一季度)开始,您将确切知道git checkout何时修改文件(而不是HEAD或分支):“ git checkout [<tree-ish>] path...”学习了报告已检出路径的数量索引或树状索引的大小,这使其具有与命令检出分支的情况相同的嘈杂度。

请参见commit 0f086e6Nguyễn Thái Ngọc Duy (pclouds)(2018年11月13日)。
(由Junio C Hamano -- gitster --commit 4084df4中合并,2019年1月14日)

  

checkout:签出路径时打印一些内容

     

git checkout”的问题之一是,它做很多不同的事情,当我们无法正确处理歧义时,可能使人们特别困惑。

     

一种帮助您解决问题的方法是告诉用户实际上执行了哪种操作。切换分支时,除非出现--quiet,否则我们总是打印一些东西:

HEAD is now at ..."
Reset branch ..."
Already on ..."
Switched to and reset ..."
Switched to a new branch ..."
Switched to branch ..."
     

签出路径却保持沉默

     

打印出一些内容,以便如果我们误解了用户的意图,他们将不会浪费太多时间来找出问题

     

对于其余的结帐情况,我们现在打印:

Checked out ... paths out of the index
Checked out ... paths out of <abbrev hash>
     

由于打印的目的是帮助消除歧义,因此仅在缺少“ {--”时这样做

但是:“ git checkout [<tree-ish>] <pathspec>”开始报告该数字 最近更新的路径,但相同的消息是 当“ git checkout -m <pathspec>解决冲突时 刚刚解决了。
现在,该消息将这些未解析的路径与从索引中检出的路径分开报告。

请参见commit 1d1f689commit 3c5883bNguyễn Thái Ngọc Duy (pclouds)(2019年2月6日)。
(由Junio C Hamano -- gitster --commit 87c9831中合并,2019年2月9日)

  

checkout:分别计算和打印-m路径

     

由于0f086e6checkout:签出路径时打印一些内容-   2018-11-13),此命令报告已更新多少个路径   来自什么来源(来自树还是来自索引)。
  我忘了还有第三个来源:使用-m时,合并冲突为   重新创建(也从索引中授予,但这不是直接副本   来自索引)。

     

分别计算和报告未合并的路径。
  还有更多更新可避免报告:

Recreated X merge conflicts
Updated 0 paths from the index
     

第二行是不必要的。虽然没有冲突   娱乐,我们仍然报告

Updated 0 paths from the index
     

为了弄清楚我们实际上并没有做任何事情。