工作区和暂存区
- 工作区(working directory)
就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区:
- 版本库(repository)
工作区中有一个隐藏目录.git,这个不算工作区,而是git的版本库。
git的版本库里存了很多东西,其中最重要的是称为stage(或者是index)的暂存区,还有git为我们自动常见的第一个分支master,以及指向master的一个指针叫HEAD。
把文件网git版本库里添加的时候,分为两步执行:
第一步是用git add把文件添加进去,实际上就是办文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为在我们创建git版本库时,git自动为我们创建了唯一一个master分支,所以现在git commit就是往master分支上提交更改。
简单的理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
例如修改readme.txt加上一行内容,然后添加一个新文件license,然后看一下git的状态:
zhangkai@bogon ~/git_zk/learngit master ● cat readme.txt git is a distributed version control system. git is free software distributed under the GPL. git has a mutable index called stage. zhangkai@bogon ~/git_zk/learngit master ● 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 no changes added to commit (use "git add" and/or "git commit -a") zhangkai@bogon ~/git_zk/learngit master ● vim license zhangkai@bogon ~/git_zk/learngit master ● 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) .DS_Store license no changes added to commit (use "git add" and/or "git commit -a") zhangkai@bogon ~/git_zk/learngit master ●
git告诉我们,readme.txt被修改了,而license还没有被添加过,所以他的状态是untracked。
现在用git add把readme.txt和license都添加了,然后用git status在看一下:
zhangkai@bogon ~/git_zk/learngit master ● git add readme.txt license .DS_Store zhangkai@bogon ~/git_zk/learngit master ✚ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: .DS_Store new file: license modified: readme.txt zhangkai@bogon ~/git_zk/learngit master ✚
现在,暂存区的状态就变成这样了:
所以git add命令实际上就是把要提交的所有修改放到暂存区(stage),然后执行git commit就可以一次性把暂存区的所有修改提交到分支。
zhangkai@bogon ~/git_zk/learngit master ✚ git commit -m "add files"
[master cf88bf6] add files
3 files changed, 5 insertions(+)
create mode 100644 .DS_Store
create mode 100644 license
zhangkai@bogon ~/git_zk/learngit master
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是干净的:
zhangkai@bogon ~/git_zk/learngit master git status
On branch master
nothing to commit, working directory clean
zhangkai@bogon ~/git_zk/learngit master
现在版本库变成了这样,暂存区就没有任何内容了:
小结
一点要知道暂存区和工作区的区别,要知道git到底操作了什么。