[TOC] #### 1. 前言 --- 眾所周知,git 中有工作區、暫存區、版本庫三大組成部分 工作區: 電腦中能看到的目錄,也就是寫代碼的地方 暫存區: 英文叫 stage 或 index。一般存放在 .git 目錄下的 index 文件中,暫存區有時也叫做索引 版本庫: 在工作區中有一個隱藏目錄 .git,這個不算工作區,而是 git 的版本庫 #### 2. git add 基本操作 --- add 命令的作用就是將工作區的文件添加到暫存區 使用示例 ``` # 將某些文件提交到暫存區 git add <file1> <file2> # 將某些目錄提交到暫存區 git add <folder1> <folder2> ``` #### 3. git add 命令參數 --- `-A, --all` add changes from all tracked and untracked files 添加所有跟蹤和未跟蹤文件的更改 -A 參數會監控工作區的狀態樹,它會把工作區的所有變化提交到暫存區,包括修改(modified)、新文件(Untracked files)、刪除的文件(deleted)。使用 `.` 在 git 2.x 也可以達到一樣的效果,但在 git 1.x 中不同的是 `.` 不會監控刪除的文件 在 git 2.x 中,下面兩種用法的效果完全相同 ``` git add . git add -A ``` `-u, --update` update tracked files 只更新已被跟蹤文件 只監控已經被 add 的文件,也就是 tracked files,不會監控沒有被跟蹤的新文件 ``` git add -u ```  #### 4. git add 背后做了什么 --- 先說結論: `git add` 會在 `.git/objects` 目錄下面創建一個目錄和文件,并且在 `.git/index` 文件中添加一行內容 這里會說到 `git cat-file` 命令,雖然平時不怎么用,但是它能幫助我們理解 `git add` 背后到底做了什么 創建一個 git 倉庫,用于查看 git add 背后做了什么操作 ``` $ git init $ echo 'hello git' >> 1.txt $ git add 1.txt $ .git/objects ├── 8d │ └── 0e41234f24b6da002d962a26c2495ea16a425f ├── info └── pack ``` 執行 git add 后: 1、git 會將工作區中的文件使用 hash sha-1 算法得到 40 位的 blob 對象 hash 字符串文件,文件中存儲的是文件類型和使用算法壓縮后的內容,如果查看文件的原始內容,需要使用 `git cat-file -p <hash>`。這個文件存放在 `.git/objects` 目錄下  2、git 會在 `.git/index` 文件中增加一行內容,就是 hash 值對應的文件名。此時就實現了文件名和內容相對應的操作 ``` # 查看暫存區中的文件名 git ls-files # 查看暫存區中的文件更多信息 git ls-files -s ``` 100644 指的是文件權限,hash 字符串對應 .git/objects 目錄下的文件  查看 hash 文件 ``` # 查看文件類型 git cat-file -t <hash> # 查看文件內容 git cat-file -p <hash> # 使用示例 git cat-file -t 8d0e412 git cat-file -p 8d0e412 ``` `git cat-file -t` 查看文件類型的返回值 | 類型 | 描述 | | ------------ | ------------ | | blob | 存儲的是工作區文件的內容 | | tree | 工作樹 | | commit | 提交記錄信息以及工作樹 | #### 5. git add 命令用法總結 --- ``` # 將某些文件添加到暫存區 git add <file1> <file2> ... # 將已被 git 追蹤的文件添加到暫存區 git add -u [<file1>] [<file2>] ... git add --update [<file1>] [<file2>] ... # 將所有文件添加到暫存區 git add . git add -A git add --all ```