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 的內容的差別