我一直在学习《 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
的快照填充索引(因为dev
和master
都指向同一提交,因为我在Visualizing Git上进行了验证)。该提交不应具有文件a.txt
,因为该文件是在提交之后创建的。另外,我的工作目录应该具有与索引相同的内容,即没有文件a.txt
。
但是,如您在上面的输出中看到的,我的工作目录中恰好有文件a.txt
,并且被git status
检测到。
我想了解我在解释该段落时犯了一个错误。
答案 0 :(得分:1)
据我所知,当切换分支时,Git签出将在工作目录中保留修改后的文件。 documentation支持以下声明:
git checkout <分支>
要准备在上工作,请通过更新工作树中的索引和文件,并将HEAD指向分支来切换到该分支。 保留对工作树中文件的本地修改,以便可以将其提交给 。
关于Git为何会发生这种行为,这可以防止通过更改分支意外清除工作目录中的更改。
答案 1 :(得分:1)
这是git checkout
的正常行为:如stated in the documentation:
保留对工作树中文件的本地修改,以便可以将其提交到
branch
。