git checkout到新分支不会刷新索引和工作目录的内容

时间:2018-11-08 08:29:37

标签: git

我一直在学习《 ProGit》一书,偶然发现“ Reset Demystified”主题下的这一段:

  

切换分支或克隆也要经历类似的过程。签出分支时,它将HEAD更改为指向新的分支引用,并使用该提交的快照填充索引,然后将索引的内容复制到工作目录中。

但是,正如您在以下终端输出中看到的那样,我无法复制行为。

GaurangTandon@Gaurang MINGW64 /j/test (master)
$ git status
On branch master
nothing to commit, working tree clean

GaurangTandon@Gaurang MINGW64 /j/test (master)
$ touch a.txt

GaurangTandon@Gaurang MINGW64 /j/test (master)
$ git checkout -b "dev"
Switched to a new branch 'dev'

GaurangTandon@Gaurang MINGW64 /j/test (dev)
$ git status
On branch dev
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        a.txt

nothing added to commit but untracked files present (use "git add" to track)

根据我对本段的解释,根据我的解释: 在新分支dev上,Git应该使用提交master的快照填充索引(因为devmaster都指向同一提交,因为我在Visualizing Git上进行了验证)。该提交不应具有文件a.txt,因为该文件是在提交之后创建的。另外,我的工作目录应该具有与索引相同的内容,即没有文件a.txt

但是,如您在上面的输出中看到的,我的工作目录中恰好有文件a.txt,并且被git status检测到。

我想了解我在解释该段落时犯了一个错误。

2 个答案:

答案 0 :(得分:1)

据我所知,当切换分支时,Git签出将在工作目录中保留修改后的文件。 documentation支持以下声明:

  

git checkout <分支>
  要准备在上工作,请通过更新工作树中的索引和文件,并将HEAD指向分支来切换到该分支。 保留对工作树中文件的本地修改,以便可以将其提交给

关于Git为何会发生这种行为,这可以防止通过更改分支意外清除工作目录中的更改。

答案 1 :(得分:1)

这是git checkout的正常行为:如stated in the documentation

  

保留对工作树中文件的本地修改,以便可以将其提交到branch