Git 的暂存区(staging area)理解

    一般在不少传统集中式版本控制系统中,只有两个空间用来管理你的数据,一个是你的working copy(工做区),另外一个即是 datastore(版本库),然而在Git中,引入了staging area(index)这一律念,咱们能够把它看作一个“码头”,你来决定其中的哪些改变能够被“运走”。
html

    有了暂存区,咱们的工做区边和Git库就再也不直接挂钩了,这样咱们能够更加灵活的控制咱们的数据了,对暂存区的操做很是的简单,git add能够将你工做区的文件添加到暂存区中,git commit 能够将暂存区中的文件提交到版本库中。git

举个例子吧:shell

$ git status
  On branch master
  Changed but not updated:
    (use "git add <file>..." to update what will be committed)
 
      modified:   README.md
      modified:   about.html
 
  Untracked files:
    (use "git add <file>..." to include in what will be committed)
 
      help.txt
  no changes added to commit (use "git add" and/or "git commit -a")

   咱们修改了README.md 和about.html两个文件,而且添加了help.txt文件,当执行git status命令时,git告诉咱们能够执行git add命令将修改添加到暂存区中。版本控制

$ git add .
$ git status
  On branch master
  Changes to be committed:
    (use "git reset HEAD <file>..." to unstage)
 
      modified:   README.md
      modified:   about.html
      new file:   help.txt

   当咱们执行git add . 后,再执行git status, git又提示咱们能够执行git reset HEAD <file>放弃添加,或者git commit 将暂存区的数据提交到版本库中。code

$ git commit -m "Adding stuff"
  Created commit e793200: Adding stuff
   2 files changed, 3 insertions(+), 0 deletions(-)
   create mode 100644 help.txt

   这样咱们就将暂存区中的数据提交到了版本库中,Git告诉咱们有两个文件被修改了,插入了三行数据,添加了一个文件。htm

   以上即是最基本的Git操做了,那到底什么是暂存区呢?咱们来看个图片可能更直观对象

  


    咱们看到图片大体分红了三个区域:工做区,index,master。目前咱们即可以把它们分别理解为工做区,暂存区,和版本库了。
图片

    能够看到add 操做将工做区数据添加到了暂存区,commit操做则提交到了版本库中,而reset HEAD是用版本库中最新提交的目录树来重置暂存区的目录树。it

    另外在咱们执行git diff操做时后面添加不一样的参数,会获得不一样的结果,这是由于比较的两个对象可能不相同,如:io

  • git diff 不加参数,比较的是工做区和暂存区的数据。

  • git diff --cached 比较的是暂存区和版本库中的数据

  • git diff HEAD/master 比较的是版本库和工做区的数据


这里只是大体的说明了下暂存区的一点点理解,至于暂存区给咱们带来的好处和强大还有不少,让咱们慢慢解开Git的面纱。

注:图片来自 机械工业出版社 蒋鑫著《Git权威指南》一书。

相关文章
相关标签/搜索