git如何知道该文件是否被删除?

时间:2014-12-11 21:01:47

标签: git

我提交了一份文件:

    $ 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如何知道如果文件没有在阶段索引中列出,那么该文件是否会被删除?什么是比较当前索引文件?它是否将它与之前的树进行比较,并将缺失的文件定义为暂存以进行删除,将新文件定义为暂存以进行添加?

1 个答案:

答案 0 :(得分:2)

你说得对 - 当你运行git status时,Changes not staged for commit部分是通过比较工作目录和索引来计算的,Changes to be committed部分是通过比较索引来计算的以及与HEAD引用指向的提交相关联的树