1. 程式人生 > 其它 >git工作區-暫存區

git工作區-暫存區

Git 本地資料管理,大概可以分為三個區,工作區,暫存區和版本庫。

工作區(Working Directory)
  是我們直接編輯的地方,例如 VScode 開啟的專案,記事本開啟的文字等,肉眼可見,直接操作。
暫存區(Stage 或 Index)
  資料暫時存放的區域,可在工作區和版本庫之間進行資料的友好交流。
版本庫(commit History)
  存放已經提交的資料,push 的時候,就是把這個區的資料 push 到遠端倉庫了

下面是,當開發者通過 git 修改資料時,各區之間的資料傳遞流程示意圖。

工作區 - 暫存區 - 版本庫

工作區有一個隱藏的目錄 .git ,這個不算工作區,而是Git的版本庫

Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD

我們把檔案往Git版本庫裡新增的時候,是分兩步執行的:

第一步是用git add把檔案新增進去,實際上就是把檔案修改新增到暫存區;

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

我們建立Git版本庫時,Git自動為我們建立了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。

可以簡單理解為,需要提交的檔案修改通通放到暫存區,然後,一次性提交暫存區的所有修改。

例: 建立一個分支 statusType 建立文字檔案 status.html,修改之前的rest檔案

先用git status 檢視一下狀態

git清楚的告訴了我們,rest檔案已被修改,而status檔案尚未被跟蹤

現在使用命令 git add . ,把rest 和 status都新增後再用status看看

現在,暫存區的狀態就變成這樣了

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

一旦提交後,如果你又沒有對工作區做任何修改,那麼工作區就是“乾淨”的:現在版本庫變成了這樣,暫存區就沒有任何內容了:

為了驗證以上流程的正確性,我們可以自己動手實驗一下,為了對比三個區之間的資料差別,過程中,可以藉助神奇的 diff 命令。

(1)git diff:

  當工作區有改動,暫存區為空,diff的對比是“工作區與最後一次commit提交的倉庫的共同檔案”;

  

  當工作區有改動,暫存區不為空,diff對比的是“工作區與暫存區的共同檔案”。

  

(2)git diff --cached 或 git diff --staged:顯示暫存區(已add但未commit檔案)和最後一次commit(HEAD)之間的所有不相同檔案的增刪改(git diff --cached和git diff –staged相同作用)

  

(3)git diff HEAD:顯示工作目錄(已track但未add檔案)和暫存區(已add但未commit檔案)與最後一次commit之間的的所有不相同檔案的增刪改。

  

(4)git diff <分支名1> <分支名2> :比較兩個分支上最後 commit 的內容的差別