Git分佈式版本控制系統(三)-理解工作區與暫存區的區別

一,理解工作區與暫存區的區別?

工作區:就是你在電腦上看到的目錄,比如目錄下testgit裏的文件(.git隱藏目錄版本庫除外)。或者以後需要再新建的目錄文件等等都屬於工作區範疇。

版本庫(Repository):工作區有一個隱藏目錄.git,這個不屬於工作區,這是版本庫。其中版本庫裏面存了很多東西,其中最重要的就是stage(暫存區),還有Git爲我們自動創建了第一個分支master,以及指向master的一個指針HEAD。

工作區、版本庫、暫存區原理圖如下圖所示:

 

說明:

1,當對工作區修改(或新增)的文件執行:command:`git add`命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。
2,當執行提交操作(:command:`git commit`)時,暫存區的目錄樹寫到版本庫(對象庫)中,master分支會做相應的更新。即master最新指向的目錄樹就是提交時原暫存區的目錄樹。
3,當執行:command:`git reset HEAD`命令時,暫存區的目錄樹會被重寫,被master分支指向的目錄樹所替換,但是工作區不受影響。
4,當執行:command:`git rm --cached <file>`命令時,會直接從暫存區刪除文件,工作區則不做出改變。
5,當執行:command:`git checkout .`或者:command:`git checkout -- <file>`命令時,會用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區的改動。
6,當執行:command:`git checkout HEAD .`或者:command:`git checkout HEAD<file>`命令時,會用HEAD指向的master分支中的全部或者部分文件替換暫存區和以及工作區中的文件。這個命令也是極具危險性的,因爲不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。 

 

我們知道使用Git提交文件到版本庫有兩步:

  第一步:是使用 git add 把文件添加進去,實際上就是把文件添加到暫存區。

  第二步:使用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支上。

  我們繼續使用demo來演示下:

  我們在readme.txt再添加一行內容,接着在目錄下新建一個文件爲test.txt 內容爲test,我們先用命令 git status來查看下狀態,如下:

  現在我們先使用git add 命令把2個文件都添加到暫存區中,再使用git status來查看下狀態,如下:

 

  接着我們可以使用git commit一次性提交到分支上,如下:

 

二,Git撤銷修改和刪除文件操作。 

  一:撤銷修改:

  比如我現在在readme.txt文件裏面增加一行 內容爲5555555,我們先通過命令查看如下:

 

  在我未提交之前,我發現添加5555555內容有誤,所以我得馬上恢復以前的版本,現在我可以有如下幾種方法可以做修改:

  第一:如果我知道要刪掉那些內容的話,直接手動更改去掉那些需要的文件,然後add添加到暫存區,最後commit掉。

  第二:我可以按以前的方法直接恢復到上一個版本。使用 git reset  --hard HEAD^

  但是現在我不想使用上面的2種方法,我想直接想使用撤銷命令該如何操作呢?首先在做撤銷之前,我們可以先用 git status 查看下當前的狀態。如下所示:

 

  可以發現,Git會告訴你,git checkout  -- file 可以丟棄工作區的修改,如下命令:

  git checkout  --  readme.txt,如下所示:

 

  命令 git checkout --readme.txt 意思就是,把readme.txt文件在工作區做的修改全部撤銷,這裏有2種情況,如下:

  1. readme.txt自動修改後,還沒有放到暫存區,使用 撤銷修改就回到和版本庫一模一樣的狀態。

  2. 另外一種是readme.txt已經放入暫存區了,接着又作了修改,撤銷修改就回到添加暫存區後的狀態。

  對於第二種情況,我想我們繼續做demo來看下,假如現在我對readme.txt添加一行 內容爲666666666,我git add 增加到暫存區後,接着添加內容7777777,我想通過撤銷命令讓其回到暫存區後的狀態。如下所示:

 

 

  注意:命令git checkout -- readme.txt 中的 -- 很重要,如果沒有 -- 的話,那麼命令變成創建分支了。

  二:刪除文件。

  假如我現在版本庫testgit目錄添加一個文件b.txt,然後提交。如下:

  

  如上:一般情況下,可以直接在文件目錄中把文件刪了,或者使用如上rm命令:rm b.txt ,如果我想徹底從版本庫中刪掉了此文件的話,可以再執行commit命令 提交掉,現在目錄是這樣的,

  只要沒有commit之前,如果我想在版本庫中恢復此文件如何操作呢?

  可以使用如下命令 git checkout  -- b.txt,如下所示:

  再來看看我們testgit目錄,添加了3個文件了。如下所示:

 

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