20150927 [學習筆記] Git版本控制(6)
[基本概念] 關於索引
  • 索引主要用來紀錄有哪些檔案即將要被提交到下一個 commit 版本中
  • 如果想要提交一個版本到 Git 儲存庫,一定要先更新索引狀態,變更才會被提交出去
  • 索引有很多別名,但是在意義上都是相同的
  • Index (索引)
  • Cache (快取)
  • Directory cache (目錄快取)
  • Current directory cache (當前目錄快取)
  • Staging area (等待被 commit 的地方)
  • Staged files (等待被 commit 的檔案)
  • [ 舉例 ] : 指令 git diff --cached 就與 git diff --staged 是完全同義的。
 
 
[內容摘要] 
  • (一)索引的狀態
  • 1.  untracked (未追蹤的)
  • 2.  unmodified (未修改的)
  • 3.  modified (已修改的)
  • 4.  staged (等待被 commit 的)
  • (二)索引的操作
  • [ 圖解 ] 指令之間的關係
  • < 指令1 >  git status    顯示工作目錄的狀態
  • < 指令2 >  git add    將變更寫入到索引
  • < 指令3 >  git rm    刪除索引裡的檔案
  • < 指令4 >  git mv    變更索引裡的檔案名稱
  • < 指令5 >  git commit    提交版本
  • < 指令6 >  git ls-files    列出索引中的檔案
  • (三)Git 指令之間的關係 (圖解)
 
 
 
 

(一)索引的狀態

  • 以下示意圖說明了透過指令改變狀態的生命週期,事實上,這些改變的過程,都是在更新「索引檔」的過程:
 
  • 索引有以下四種主要的檔案狀態:
1.  untracked (未追蹤的)
  • 代表尚未被加入 Git 儲存庫的檔案狀態
 
 
2.  unmodified (未修改的)
  • 代表檔案第一次被加入,或是檔案內容與 HEAD 內容一致的狀態。
 
 
3.  modified (已修改的)
  • 代表檔案已經被編輯過,或是檔案內容與 HEAD 內容不一致的狀態。
 
 
4.  staged (等待被 commit 的)
  • 代表下次執行 git commit 會將這些檔案全部送入版本庫
 
 
 
 

(二)索引的操作

[ 圖解 ] 指令之間的關係
 
 
< 指令1 >  git status    顯示工作目錄的狀態
  • 取得 工作目錄 (working tree) 下的狀態,目的是顯示出 目前最新版索引檔 之間的差異;只有 目前最新版索引檔 之間有差異的變更,才會真正儲存到下一個 commit 物件裡。
 
  • 儲存庫、工作目錄、物件與索引之間的關係:
  • Git 的運作,是將工作目錄裡的變化,透過更新索引的方式,將資料寫入成 Git 物件
 
[ 範例 ] 執行 git status 
G:\git-demo>git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   c.txt
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   a.txt
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       b.txt
 
  • 內容說明:
  1. Changes to be committed (準備提交的變更)
  • 這區有個 new file: c.txt 檔案,代表 c.txt 是一個新檔案,而且已經被標示可提交。
  • 這代表著:
  • 目前最新版 並沒有 c.txt 這個檔案
  • 索引檔 已經加入了這個 c.txt 檔案
  • 所以該檔案會在執行 git commit 之後被存入下一個版本。
  1. Changes not staged for commit (尚未準備提交的變更)
  • 這區有個 modified: a.txt 檔案,代表 a.txt 已經被變更,但尚未標示可提交。 (not staged)
  • 這代表著:
  • 目前最新版 也有 a.txt 這個檔案。
  • 索引檔 尚未加入 a.txt 這個檔案。
  • 所以該檔案就算執行了 git commit 也不會在下一版中出現。
  • Untracked files (未追蹤的變更)
  • 這區有個 b.txt 檔案,代表 b.txt 尚未被追蹤。(untracked)
  • 這代表著:
  • 目前最新版 沒有 b.txt 這個檔案。
  • 索引檔 也沒有 b.txt 這個檔案。
  • 所以該檔案就算執行了 git commit 也不會在下一版中出現。
 
 
< 指令2 >  git add    將變更寫入到索引
  • 目前「工作目錄」的變更寫入到「索引檔」裡
  • 使用 git add -u 則可以僅將「更新」或「刪除」的檔案變更寫入到「索引檔」中
 
 
< 指令3 >  git rm    刪除索引裡的檔案
  • 當你直接在檔案系統中刪除一個檔案,這只是從「工作目錄」中刪除而已,並沒有更新到索引檔,不過若要真正把「刪除」的狀態寫進索引檔的話,要使用 git rm filename 更新索引檔
 
  • 在執行 git rm filename 的時候,除了更新索引檔之外,連工作目錄下的檔案也會一併被刪除。
 
  • 若你只想刪除索引檔中的該檔,又要保留工作目錄下的實體檔案,那麼你可以在指令列加上 --cached 參數,就能做到,例如:git rm --cached a.txt
 
 
< 指令4 >  git mv    變更索引裡的檔案名稱
  • 使用 git mv oldname newname 可以將檔案更名,執行此命令會同時更新索引與變更工作目錄下的實體檔案
 
 
< 指令5 >  git commit    提交版本
  • 比對「索引檔」與「目前最新版」中的資料差異,然後把差異部分提交成一個 commit 物件
 
 
< 指令6 >  git ls-files    列出索引中的檔案
  • 在索引檔中預設包含 目前最新版 的所有檔案,外加在工作目錄中新增檔案且透過 git add 更新索引檔後的那些檔案。
  • 透過 git ls-files 命令,可以列出所有目前已經儲存在「索引檔」中的那些檔案
 
 
 
 

(三)Git 指令之間的關係 (圖解)