1.HEAD、Index、Working Directory
Git里有三个区域很重要
- HEAD 指向最近一次commit里的所有snapshot
- Index 缓存区域,只有Index区域里的东西才可以被commit
- Working Directory 用户操作区域
2.各种状态
初始状态
当你checkout分支的时候,git做了这么三件事情
- 将HEAD指向那个分支的最后一次commit
- 将HEAD指向的commit里所有文件的snapshot替换掉Index区域里原来的内容
- 将Index区域里的内容填充到Working Directory里
所以你可以发现,HEAD、Index、Working Directory这个时候里的内容都是一模一样的。
注意:一般会误解为,Index中的内容是空的,只有git add后才会有东西。实际上不是,Index里一直是有东西的。
所以,Git的所有操作就是对这三个区域的状态(或内容)的操作。
Untracked files
如果在目录下新建了文件(即之前没有add过的文件,就会出现“untracked files”即没有被跟踪的文件)
Untracked files:
(use "git add <file>..." to include in what will be committed)
b.txt
Changed
如果你在Working Directory里修改了文件,git会发现Working Directory里的内容和Index区域里的内容不一致了。
这个时候git status的结果是:
# Changes not staged for commit:(之前add过的文件但是又被修改了)
Staged
一个文件仅仅changed是不能被commit的,Git要求只能提交Index里的东西。
所以需要git add。这个命令的意思是,把Changed的文件的内容同步到Index区域里。这样Working Directory和Index区域的内容就一致了。这个过程被称之为stage
这个时候git status的结果是:
# Changes to be committed:(已经add过的就等commit了)
Committed
最后,你就可以提交了
git commit
这样,就把HEAD的状态和Index以及Working Directory形成一致了。
ref:https://segmentfault.com/a/1190000006185954