圖解Git工作區、暫存區、版本庫之間的關係

聲明:碼字不易,轉載請註明出處,歡迎文章下方討論交流。

注:本文適合初學者和對git三分熟以下的讀者

工作區、暫存區、版本庫概念

拿自己親身經歷來說,初次接觸git的時候最讓人迷惑的無非是這三者的概念和他們之間的關係,搞懂這三個概念和他們之間的關係,可以說你對git瞭解已經三分熟了。本文是筆者使用git一年多後對一些基本概念的個人理解,寫在這一方面給爲初學者掃盲,同時也總結一下。

先上圖,請務必將此圖深深印在腦海裏:
工作區暫存區版本庫

  • 工作區:用來編輯保存項目文件的地方,也是用戶能直接操作到的地方。
  • 暫存區:保存了下次將提交的文件列表信息,一般在 Git 倉庫目錄中,是一個叫index的文件,通常多數說法還是叫暫存區域;
  • 版本庫:也叫本地版本庫,之所以說git 快,是因爲它是分佈式版本控制系統,大部分提交都是對本地倉庫而言的,不依賴網絡,最後一次會推送的到遠程倉庫。

關於遠程倉庫本文暫時不提,過幾天再更。

下面通過例子來說明:

首先在e:/gittest/下使用git init將其初始化爲一個git倉庫,此時git爲爲我們生成一個隱藏文件夾.git,git的暫存區和版本庫都被管理在這個隱藏文件夾中。特別強調,不要閒的沒事修改這個隱藏文件夾下的內容,否則git版本控制會失靈,嚴重的話將會給項目造成重大損失。
在e:/gittest/下,除去隱藏文件夾之外的都叫工作區,就是用戶可以編輯保存項目文件的地方,我們新建一個doc1.txt文件,並在寫入一些信息。
圖片描述

此時:工作區有一個doc1.txt的文件,暫存區是空的,版本庫也是空的。
使用git add doc1.txt命令就將工作區中的文件添加到暫存區,此時暫存區有東西了,暫存區存放的就是即將要提交到版本庫裏的文件列表信息。
此時,用git status命令去查看狀態,會發現git提示我們changes to be committed,這個changes是新的文件doc1.txt。
圖片描述

接下來,我們在工作區創建一個doc2.txt,此時,工作區有兩個文件doc1.txt和doc2.txt。再用git status查看會發現暫存區的doc1.txt待提交,同時因爲工作區新建的doc2.txt沒有被add到暫存區,git提示我們有一個untracked(未被追蹤)的文件。
圖片描述

我們先使用git commit將doc1.txt提交到版本庫,再將doc2.txt添加到暫存區,再將doc1.txt增加一行內容,此時,工作區中的doc1和暫存區中的doc1已經有所區別了,暫存區中存放的是上一版本的doc1和doc2,版本庫中只有doc1,因爲doc2還沒有被commit,再用git status查看,會發現git提示我們changes not staged for commit,意思是說doc1已經被修改了但還未添加到暫存區。事實上,git管理的是添加到暫存區裏面的修改,包括增刪改等等都算是可以跟蹤的文件變動,也可以說git只管理我們變動的部分變動的我們才往暫存區提交,這也是git比其他版本系統設計優秀的一點。
圖片描述

我們注意上圖中,對於doc1的修改,git提示我們,要麼git add去更新暫存區的內容以便後面commit到版本庫,要麼使用git check out將版本庫中的doc1 檢出到工作區discard changes(放棄修改)。

到這讀者可以回到本文第一張圖中仔細回味,並加以實驗練習,相信很快能理解這工作區、暫存區、版本庫之間的工作關係。

總結git基本的工作流程如下:

  1. 在工作目錄中修改(此處修改包含了創建和刪除)文件;
  2. 暫存文件,將文件add放入暫存區域;
  3. 提交更新,找到暫存區域的文件,將暫存區的文件commit到版本庫;
  4. 如果工作區的文件改亂了(包括了誤刪、誤改),想回到上一版本,就可以使用git checkout 命令將版本庫中的文件檢出到工作區將本次更改discard(覆蓋)掉。

碼字不易,如對您有幫助,歡迎點贊收藏打賞^_^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章