工作区和暂存区

  • 工作区(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到底操作了什么。

原文地址:https://www.cnblogs.com/allan-king/p/5429752.html