我提交了一份文件:
$ git init
$ echo 'content here' | git hash-object -w --stdin
ab9fb23311ea27af88324b66a5a00c826fdcfbb8
$ git update-index --add --cache 100644 \
ab9fb23311ea27af88324b66a5a00c826fdcfbb8 file1.text
$ git commit -m "setting up"
$ git checkout-index -a
检查一切正常:
$ git status
On branch master
nothing to commit, working directory clean
现在,如果我从工作目录中删除该文件并运行git status
git将告诉我该文件已被删除但未上传为提交:
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: file1.text
no changes added to commit (use "git add" and/or "git commit -a")
由于删除工作目录中的文件并未将其从staged
中的index
区域删除 - ls-files --stage
仍显示该文件,我认为该文件被删除的事实由简单地比较现在在index
的分段区域中的内容 - ls-files --stage
的输出和工作树中的内容。所以这里一切都很清楚。
但后来我运行了这个:
$ git rm file1.text
rm 'file1.text'
该文件实际上已从index
移除 - ls-files --staged
未显示该文件。如果我现在运行git status
,我会得到以下内容:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: file1.text
所以git现在知道它被删除了。如果运行git commit
git将创建没有此文件的新树。所以我的问题是git如何知道如果文件没有在阶段索引中列出,那么该文件是否会被删除?什么是比较当前索引文件?它是否将它与之前的树进行比较,并将缺失的文件定义为暂存以进行删除,将新文件定义为暂存以进行添加?
答案 0 :(得分:2)
你说得对 - 当你运行git status
时,Changes not staged for commit
部分是通过比较工作目录和索引来计算的,Changes to be committed
部分是通过比较索引来计算的以及与HEAD引用指向的提交相关联的树