工作區、暫存區、版本庫
- 工作區:是在電腦上你要寫代碼或文件的目錄。
- 暫存區:英文叫 stage 或 index。一般存放在 .git 目錄下的 index 文件(.git/index)中,我們把暫存區有時也叫作索引(index)。
- 版本庫:又名倉庫,英文名 repository 。工作區有一個隱藏目錄 .git ,它不算工作區,而是 Git 的版本庫。這個版本庫里面的所有文件都可以被 Git 管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
下面這個圖展示了工作區、暫存區和版本庫之間的關系:
圖中左側為工作區,右側為版本庫。Git 的版本庫里存了很多東西,其中最重要的就是暫存區。
? 在創建 Git 版本庫時,Git 會為我們自動創建一個唯一的 master 分支,以及指向 master 的一個指
針叫 HEAD。(分支和HEAD的概念后面再說)
? 當對工作區修改(或新增)的文件執行 git add
命令時,暫存區目錄樹的文件索引會被更新。
? 當執行提交操作 git commit
時,master 分支會做相應的更新,可以簡單理解為暫存區的目錄樹才會被真正寫到版本庫中。
由上述描述我們便能得知:通過新建或粘貼進?錄的?件,并不能稱之為向倉庫中新增文件,而只是在工作區新增了文件。必須要通過使用 git add
和 git commit
命令才能將文件添加到倉庫中進行管理!!!
基本指令
在包含 .git 的目錄下新建一個 ReadMe 文件,我們可以使用 git add
命令可以將文件添加到暫存區:
? 添加一個或多個文件到暫存區: git add [file1] [file2] ...
? 添加指定目錄到暫存區,包括子目錄: git add [dir]
? 添加當前目錄下的所有文件改動到暫存區: git add .
再使? git commit
命令將暫存區內容添加到本地倉庫中:
? 提交暫存區全部內容到本地倉庫中: git commit -m "message"
? 提交暫存區的指定?件到倉庫區: git commit [file1] [file2] ... -m "message"
注意 git commit
后面的 -m
選項,要跟上描述本次提交的 message
,由用戶完成,這部分內容絕對不能省略,并要好好描述,是用來記錄你的提交細節,是給我們人看的。
例如:
git commit 命令執行成功后會告訴我們,1個文件被改動(就是我們新添加的ReadMe文件),插入了一行內容(ReadMe有一行內容)。
我們還可以多次 add 不同的文件,而只 commit 一次便可以提交所有文件,是因為需要提交的文件是通通被 add 到暫存區中,然后一次性 commit 暫存區的所有修改。如
截至目前為止,我們已經更夠將代碼直接提交至本地倉庫了。我們可以使用 git log
命令,來查看下歷史提交記錄。
該命令顯示從最近到最遠的提交日志,并且可以看到我們 commit
時的日志消息。
如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上 --pretty=oneline
參數:
需要說明的是,我們看到的一大串類似 23807c5…56eed6 的是每次提交的 commit id
(版本號),Git 的 commit id 不是1,2,3……遞增的數字,而是一個 SHA1 計算出來的一個非常大的數字,用十六進制表示(你看到的 commit id 和我的肯定不一樣,以你自己的為準)。
查看 .git 文件
先來看看我們的 .git 的目錄結構:
-
index 就是我們的暫存區,add 后的內容都是添加到這里的。
-
HEAD 就是我們的默認指向 master 分支的指針:
而默認的master
分支,其實就是
打印的 82a32a9010e8dfc2c94124d973c744d92a120a53 是什么東西呢?保存的就是當前最新
的commit id
。 -
objects 為 Git 的對象庫,里面包含了創建的各種版本庫對象及內容。當執行
git add
命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,就位于 “.git/objects” 目錄下,讓我們來看看這些對象有何用處:
查找 object 時要將 commit id 分成2部分,其前2位是文件夾名稱,后38位是文件名稱。
找到這個文件之后,一般不能直接看到里面是什么,該類文件是經過 sha (安全哈希算法)加密過的文件,好在我們可以使影 git cat-file
命令來查看版本庫對象的內容:
這就是我們最近?次的提交
其中,還有?行tree 1fbf42c98753beefa45a2e0f48bd171dac697592
,我們使用同樣的方法,看看結果:
在看 test 對應的 8836513e5d67c172edd7e79031674c9bb2ffff69
這是我們對ReadMe做的修改!!被git記錄了下來!!
總結一下,在本地的 git 倉庫中,有幾個文件或者目錄很特殊
- index: 暫存區,
git add
后會更新該內容。 - HEAD: 默認指向 master 分?的一 個指針。
- refs/heads/master: 文件里保存當前 master 分支的最新
commit id
。 - objects: 包含了創建的各種版本庫對象及內容,可以簡單理解為放了 git 維護的所有修改。
學習到這里,我們已經清楚了如何向倉庫中添加文件,并且對于工作區、暫存區、版本庫也有了一定的認識。那么我們再展示一種添加文件的場景,能加深對工作區、暫存區、版本庫的理解,示例如下:
提交后發現打印了 1 file changed, 0 insertions(+), 0 deletions(-)
,意思是只有一個文件改變了,這時我們提出了疑問,不是新增了兩個文件嗎?
再來回憶下, git add
是將文件添加到暫存區, git commit
是將暫存區的內容添加到本地倉庫中。由于我們并沒有使用 git add file5
,file5
就不在暫存區中維護,所以我們 commit
的時候其實只是把已經在暫存區的 file4 提交了,而遺漏了工作區的 file5
。
如何提交 file5
呢?很簡單,再次add
, commit
即可。