git 三大區域的操作分析
可以將git簡單的分為三個區域
1、工作區(working directry)
2、暫緩區(stage index)
3、歷史記錄區(history)
如圖:
git add files 把當前工作目錄中的檔案放入暫存區域
其實做了兩件事:
1、將本地檔案的時間戳、長度,當前文件物件的id等資訊儲存到乙個樹形目錄中去(index,即平時說的暫存區)
2、將本地檔案的內容做快照並儲存到git 的物件庫
(綜上:實際上就是乙個包含檔案索引的目錄樹,像是乙個虛擬的工作區。在這個虛擬工作區的目錄樹中,記錄了檔名、檔案的狀態資訊(時間戳、檔案長度等),檔案的 內容並不儲存其中,而是儲存在 git 物件庫(.git/objects)中,檔案索引建立了檔案和物件庫中物件實體之間的對應。)
如圖:
在這個圖中,我們可以看到部分 git 命令是如何影響工作區和暫存區(stage, index)的:
圖中左側為工作區,右側為版本庫。在版本庫中標記為 "index" 的區域是暫存區(stage, index),標記為 "master" 的是 master 分支所代表的目錄樹。
圖中我們可以看出此時 "head" 實際是指向 master 分支的乙個「游標」。所以圖示的命令中出現 head 的地方可以用 master 來替換。
圖中的 objects 標識的區域為 git 的物件庫,實際位於 ".git/objects" 目錄下
當對工作區修改(或新增)的檔案執行 "git add" 命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的檔案內容被寫入到物件庫中的乙個新的物件中,而該物件的id 被記錄在暫存區的檔案索引中
當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(物件庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹
git reset -- files 用來撤銷最後一次git add files(因為每git add file一次,暫存區的檔案都會被更改一次),你也可以用git reset 撤銷所有暫存區域檔案。
git checkout -- files 把檔案從暫存區域複製到工作目錄,用來丟棄本地修改。
當執行 "git rm --cached " 命令時,會直接從暫存區刪除檔案,工作區則不做出改變
當執行 "git checkout ." 或者 "git checkout -- " 命令時,會用暫存區全部或指定的檔案替換工作區的檔案。這個操作很危險,會清除工作區中未新增到暫存區的改動
當執行 "git checkout head ." 或者 "git checkout head " 命令時,會用 head 指向的 master 分支中的全部或者部分檔案替換暫存區和以及工作區中的檔案。這個命令也是極具危險性的,因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改 動
當執行 "git status" 命令掃瞄工作區改動的時候,先依據 .git/index 檔案中記錄的(工作區跟蹤檔案的)時間戳、長度等資訊判斷工作區檔案是否改變。如果工作區的檔案時間戳改變,說明檔案的內容 可能 被改變了,需要要開啟檔案,讀取檔案內容,和更改前的原始檔案相比較(本地檔案和與之對應的object庫中的檔案的內容進行對比),判斷檔案內容是否被更改。如果檔案內容沒有改變,則將該檔案新的時間戳記錄到 .git/index 檔案中。因為判斷檔案是否更改,使用時間戳、檔案長度等資訊進行比較要比通過檔案內容比較要快的多,所以 git 這樣的實現方式可以讓工作區狀態掃瞄更快速的執行,這也是 git 高效的因素之一。
git diff files 來進行具體檔案的變動對比,通常用來進行work directory 與 stage之間的對比,實質上是用 git objects 庫中的快照與work directory 檔案的內容的對比
文章內容**
GIT系列 「02」GIT三大區域
三大區域即即工作區,暫存區,和本地倉庫。首先說明下head,head 是當前分支引用的指標,它總是指向該分支上的最後一次提交。這表示 head 將是下一次提交的父結點。可以將head看作當前分支上的最後一次commit的快照。工作區 working director 位置上對應專案目錄裡面所有檔案,...
記憶體的5大區域介紹
1.棧區 stack 是由 編譯器 自動分配並釋放,存放函式的 引數值 區域性變數等。棧是 系統 資料結構,對應的 執行緒 程序 是唯一的。優點是快速高效,缺點是資料不靈活 先進先出 棧空間 靜態分配 動態分配。靜態分配 由編譯器完成的,比如自動變數 auto 的分配。動態分配 由alloc函式完成...
VC與VB的三大區別
這是我以前碰到的乙個面試題,當時我對這兩者都不甚熟悉,且發現面試官態度傲慢,就胡亂的說了兩個答案。突然間有想到這個問題,本著對自己負責任態度,得出的答案如下 1.兩者的設計出發點不一樣.vc更注重程式的效率,而vb則強調易用性 2.vc為編譯型,編譯後得到的程式可直接執行。vb為解釋型,編譯後得到的...