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權威指南》一書。

相關文章
相關標籤/搜索