鍍金池/ 教程/ Java/ 工作區(qū)和暫存區(qū)
操作標(biāo)簽
多人協(xié)作
解決沖突
Git 的誕生
工作區(qū)和暫存區(qū)
搭建 Git 服務(wù)器
Bug 分支
配置別名
從遠(yuǎn)程庫克隆
分支
添加遠(yuǎn)程庫
分支管理策略
撤銷修改
安裝 Git
管理修改
生成 SSH key
GitHub
倉庫狀態(tài)
忽略特殊文件
刪除文件
Feature 分支
創(chuàng)建與合并分支
創(chuàng)建版本庫
創(chuàng)建標(biāo)簽
版本回退
集中式 vs 分布式

工作區(qū)和暫存區(qū)

Git 和其他版本控制系統(tǒng)如 SVN 的一個(gè)不同之處就是有暫存區(qū)的概念。

先來看名詞解釋。

工作區(qū)

就是你在電腦里能看到的目錄,比如我的learngit文件夾就是一個(gè)工作區(qū):

http://wiki.jikexueyuan.com/project/git-tutorial/images/git9.png" alt="" />

版本庫

工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不算工作區(qū),而是 Git 的版本庫。

Git 的版本庫里存了很多東西,其中最重要的就是稱為 stage(或者叫 index)的暫存區(qū),還有 Git 為我們自動(dòng)創(chuàng)建的第一個(gè)分支 master,以及指向 master 的一個(gè)指針叫 HEAD。

http://wiki.jikexueyuan.com/project/git-tutorial/images/git10.jpg" alt="" />

分支和 HEAD 的概念我們以后再講。

前面講了我們把文件往 Git 版本庫里添加的時(shí)候,是分兩步執(zhí)行的:

第一步是用git add把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存區(qū);

第二步是用git commit提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。

因?yàn)槲覀儎?chuàng)建 Git 版本庫時(shí),Git 自動(dòng)為我們創(chuàng)建了唯一一個(gè) master 分支,所以,現(xiàn)在,git commit就是往 master 分支上提交更改。

你可以簡單理解為,需要提交的文件修改通通放到暫存區(qū),然后,一次性提交暫存區(qū)的所有修改。

俗話說,實(shí)踐出真知?,F(xiàn)在,我們?cè)倬毩?xí)一遍,先對(duì) readme.txt 做個(gè)修改,比如加上一行內(nèi)容:

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.

然后,在工作區(qū)新增一個(gè) LICENSE 文本文件(內(nèi)容隨便寫)。

先用git status查看一下狀態(tài):

$ 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 被修改了,而 LICENSE 還從來沒有被添加過,所以它的狀態(tài)是 Untracked。

現(xiàn)在,使用兩次命令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
#

現(xiàn)在,暫存區(qū)的狀態(tài)就變成這樣了:

http://wiki.jikexueyuan.com/project/git-tutorial/images/git11.jpg" alt="" />

所以,git add命令實(shí)際上就是把要提交的所有修改放到暫存區(qū)(Stage),然后,執(zhí)行git commit就可以一次性把暫存區(qū)的所有修改提交到分支。

$ git commit -m "understand how stage works"
[master 27c9860] understand how stage works
 2 files changed, 675 insertions(+)
 create mode 100644 LICENSE

一旦提交后,如果你又沒有對(duì)工作區(qū)做任何修改,那么工作區(qū)就是“干凈”的:

$ git status
# On branch master
nothing to commit (working directory clean)

現(xiàn)在版本庫變成了這樣,暫存區(qū)就沒有任何內(nèi)容了:

http://wiki.jikexueyuan.com/project/git-tutorial/images/git12.jpg" alt="" />

小結(jié)

暫存區(qū)是 Git 非常重要的概念,弄明白了暫存區(qū),就弄明白了 Git 的很多操作到底干了什么。

沒弄明白暫存區(qū)是怎么回事的童鞋,請(qǐng)向上滾動(dòng)頁面,再看一次。