文件的状态 与 Git文件的三种状态
针对本地的一个项目,如果不是从github上下载,则所有文件一开始都属于untracked状态,否则都属于tracked状态。
属于untracked状态的文件,如果我们不将其添加到git中,任意的修改都不会影响git状态。
所以如果是我们想要保存到git中的文件,我们首先要将其添加到git中,命令就是git add。添加之后的文件就属于tracked状态。
tracked状态本身又有三个子状态:modified,staged和committed。
对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。
已提交表示该文件已经被安全地保存在本地数据库中了;
已修改表示修改了某个文件,但还没有提交保存;
已暂存表示把已修改的文件放在下次提交时要保存的清单中。
Git 大概分为三个区
Git 本地数据管理,大概可以分为三个区,工作区,暂存区和版本库。
- 工作区(Working Directory)
是我们直接编辑的地方,例如 Android Studio 打开的项目,sublime打开的文本等,肉眼可见,直接操作。 - 暂存区(Stage 或 Index)
数据暂时存放的区域,可在工作区和版本库之间进行数据的友好交流。 - 版本库(commit History)
存放已经提交的数据,push 的时候,就是把这个区的数据 push 到远程仓库了。
下面是,当开发者通过 git 修改数据时,各区之间的数据传递流程示意图。
为了验证以上流程的正确性,我们可以自己动手实验一下,为了对比三个区之间的数据差别,过程中,可以借助神奇的 diff 命令。
git diff 工作区 vs 暂存区
git diff head 工作区 vs 版本库
git diff –cached 暂存区 vs 版本库
1.刚开始,什么操作都没有,三个区的数据是一致的,执行 git diff 命令都为空
2.编辑文件增加代码,现在工作区
内容发生变化,暂存区
和版本库
内容不变。
3.执行git add 操作后,修改同步到暂存区
,现在工作区
和暂存区
数据一致。
4.执行git commit 操作后,修改已经同步到版本库
,三区数据再次保持一致。
练习
对readme.txt
做个修改,比如加上一行内容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
然后,在工作区新增一个LICENSE
文本文件(内容随便写)。
先用git status
查看一下状态:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
LICENSE
no changes added to commit (use "git add" and/or "git commit -a")
Git非常清楚地告诉我们,readme.txt
被修改了,Changes not staged for commit------修改没有被暂存起来以备提交
而LICENSE
还从来没有被添加过,所以它的状态是Untracked,
并且提示使用“git add <file>...”的命令将文件包含到待提交清单即暂存区(Stage)中。
现在,使用两次命令git add
,把readme.txt
和LICENSE
都添加后,用git status
再查看一下:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: LICENSE
modified: readme.txt
Changes to be committed----更改有待被提交
所以,git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit
就可以一次性把暂存区的所有修改提交到分支。
$ git commit -m "understand how stage works"
[master e43a48b] understand how stage works
2 files changed, 2 insertions(+)
create mode 100644 LICENSE
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:
$ git status
On branch master
nothing to commit, working tree clean