# git-add
> 原文: [https://git-scm.com/docs/git-add](https://git-scm.com/docs/git-add)
>
> 貢獻者:[yulezheng](https://github.com/yulezheng)
## 名稱
git-add - 將文件內容添加到暫存區(stage,或者叫index)中
## 概要
```
git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
[--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
[--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--renormalize]
[--chmod=(+|-)x] [--] [<pathspec>…?]
```
## 描述
此命令使用工作樹中當前的內容更新暫存區,為下一次提交(commit)暫存內容。它通常將現有路徑的當前內容作為一個整體添加,但是通過一些選項,它還可以用于添加僅部分對于工作樹的修改被應用的內容,或者刪除工作樹中不再存在的路徑。
暫存區保存工作樹內容的快照,并將此快照作為下一次提交(commit)的內容。因此,在對工作樹進行任何更改之后,在運行commit命令之前,必須使用`add`命令將新的文件或有改動的文件添加到暫存區中。
在提交(commit)之前可以多次執行此命令。它只添加指定文件在add命令運行時刻的內容;如果您希望下次提交(commit)中包含后續更改,則必須再次運行`git add`以將新內容添加到暫存區中。
`git status`命令可用于列出改動被放入暫存區但還未提交的文件。
默認情況下,`git add`命令不會添加忽略的文件。如果在命令行中顯式指定了任何忽略的文件,則`git add`將運行失敗并且顯示出忽略文件的列表。由Git執行的目錄遞歸或文件名通配所覆蓋到的忽略文件將被默認忽略。 `git add` 命令可使用`-f`(force)選項添加被忽略的文件。
有關將內容添加到提交(commit)的其他方法,請參閱 [git-commit [1]](https://git-scm.com/docs/git-commit) 。
## 選項
```
<pathspec>…
```
要添加內容的文件。可以用文件名通配符(例如`*.c`)來添加所有匹配的文件。還可以給出一個主目錄名稱(例如用`dir`添加`dir/file1`和`dir/file2`),將整個目錄的當前狀態作為一個主體來更新暫存區(例如,指定`dir`將不僅記錄工作樹中修改了文件`dir/file1`,添加了文件`dir/file2`,還會記錄刪除了文件`dir/file3`)。請注意,舊版本的Git默認忽略已刪除的文件;如果要添加已修改或新增的文件但忽略已刪除的文件,請使用`--no-all`選項。
有關< pathspec>的詳細信息,請參閱 [gitglossary [7]](https://git-scm.com/docs/gitglossary) 中的 _pathspec_ 條目。
```
-n
```
```
--dry-run
```
實際上不添加文件(至暫存區),只顯示文件是否存在和/或被忽略。
```
-v
```
```
--verbose
```
列出詳細信息。
```
-f
```
```
--force
```
允許強制添加忽略的文件。
```
-i
```
```
--interactive
```
將工作樹中被修改的內容以交互方式添加到暫存區中。提供可選的路徑參數以將操作限制于工作樹的一個子集中。詳細信息請參閱“交互模式”。
```
-p
```
```
--patch
```
以交互方式選擇暫存區和工作樹之間的修改,并將它們添加到暫存區中。這使用戶有機會在將修改后的內容添加到暫存區之前查看差異。
這實際上運行了`add --interactive`,但繞過初始命令菜單并直接跳轉到`patch`子命令。詳細信息請參閱“交互模式”。
```
-e
```
```
--edit
```
在編輯器中打開與暫存區不一致的內容,讓用戶編輯它。編輯器關閉后,調整代碼塊內容并將修改應用于暫存區。
此選項的目的是選擇要應用哪些修改過的行,甚至修改要暫存的行的內容。這比使用交互式代碼塊選擇器更快更靈活。但是,這很容易導致混淆從而產生不需要應用于暫存區的修改。參閱下面的EDITING PATCHES。
```
-u
```
```
--update
```
只在已有的匹配< pathspec>的條目中更新暫存區。這將刪除或修改暫存區條目以匹配工作樹,但不添加新文件。
如果在使用`-u`選項時沒有給出< pathspec>,將更新整個工作樹中的所有跟蹤文件(舊版本的Git將更新限定于當前目錄及其子目錄)。
```
-A
```
```
--all
```
```
--no-ignore-removal
```
將工作樹中匹配< pathspec>的文件和暫存區中已有的條目內容更新到暫存區。這將添加,修改和刪除暫存區條目以匹配工作樹。
如果在使用`-A`選項時沒有給出< pathspec>,將更新當前工作樹中的所有文件(舊版本的Git將更新限定于當前目錄及其子目錄)。
```
--no-all
```
```
--ignore-removal
```
通過添加暫存區沒有的新文件和工作樹中有修改的文件來更新暫存區,但忽略已從工作樹中刪除的文件。當沒有< pathspec>時,此選項不起作用。
此選項主要用于幫助習慣了舊版本Git的用戶,其“git add< pathspec> ...”是“git add --no-all< pathspec> ...”的同義詞,即忽略已刪除文件。
```
-N
```
```
--intent-to-add
```
僅記錄稍后將添加路徑的事實。路徑的條目放在暫存區中,沒有內容。除其他外,這對于使用`git diff`顯示此類文件的未分級內容并使用`git commit -a`提交它們非常有用。
```
--refresh
```
不添加文件,而只刷新它們在暫存區中的stat()信息。
```
--ignore-errors
```
如果由于索引錯誤而無法添加某些文件,不中止操作,而是繼續添加其他文件。該命令仍將以非零狀態退出。配置變量`add.ignoreErrors`可以設置為true以使其成為默認行為。
```
--ignore-missing
```
此選項只能與--dry-run一起使用。通過使用此選項,用戶可以檢查是否將忽略某些給定文件,無論它們是否已存在于工作樹中。
```
--no-warn-embedded-repo
```
默認情況下,若未使用`git submodule add`在`.gitmodules`中創建條目時就向暫存區中添加嵌入式存儲庫,`git add`會發出警告。此選項將禁止警告(例如在子模塊上手動執行操作)。
```
--renormalize
```
對所有被跟蹤的文件應用"clean"進程,以強制將它們再次添加到暫存區。在更改`core.autocrlf`配置或`text`屬性以更正添加的文件中錯誤的CRLF / LF行結尾方式時,這很有用。該選項與`-u`同義。
```
--chmod=(+|-)x
```
覆蓋被添加文件的可執行權限。可執行權限僅在暫存區中更改,磁盤上的文件保持不變。
```
--
```
此選項可用于將命令行選項與文件列表分開(當文件名可能被誤認為是命令行選項時很有用)。
## 例子
* 添加`Documentation`目錄及其子目錄下所有`*.txt`文件的內容:
```
$ git add Documentation/\*.txt
```
請注意,在此示例中,使用了星號`*`;這使命令包含來自`Documentation/`子目錄的文件。
* 從所有git - * .sh腳本添加內容:
```
$ git add git-*.sh
```
因為這個例子除了星號還補充了其他條件(即明確地列出了文件),所以它不包括`subdir/git-foo.sh`。
## 交互模式
當命令進入交互模式時,它顯示_狀態_子命令的輸出,然后進入其交互式命令循環。
命令循環顯示可用的子命令列表,并給出提示“What now>”。通常,當提示以單個_>結束時 ,您只能選擇輸入給定的一個選項,如下所示:
```
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now> 1
```
如果符合的選項是唯一的,您也可以輸入`s`或`sta`或`status`。
主命令循環有6個子命令(加上幫助和退出)。
```
status
```
運行這條命令將顯示每個路徑中HEAD和暫存區之間的變化(即,如果此時`git commit`將會提交什么),以及暫存區和工作樹文件之間的變化(即你在`git commit`之前可以使用`git add`暫存什么)。示例輸出如下所示:
```
staged unstaged path
1: binary nothing foo.png
2: +403/-35 +1/-1 git-add--interactive.perl
```
它表明foo.png與HEAD有區別(但是文件為二進制因此無法顯示行數)并且暫存區副本和工作樹版本之間沒有區別(如果工作樹版本也存在不同,顯示的就不是*nothing*而是*binary*)。另一個文件git-add {litdd} interactive.perl,如果你提交了暫存區中的內容,則添加了403行并刪除了35行,但工作樹文件中仍有進一步修改(一次添加和一次刪除)。
```
update
```
這會顯示狀態信息并發出“Update>>”提示。當提示以double >>結束時,您可以進行多個選擇,用空格或逗號連接。你也可以選擇范圍,例如,“2-5 7,9”表示從列表中選擇2,3,4,5,7,9。如果省略范圍中的第二個數字,則選中第一個數字之后的所有選項。例如。 “7-”從列表中選擇7,8,9。你可以用 _*_ 來選擇所有。
您選中的內容將用 _*_ 標志,如下所示:
```
staged unstaged path
1: binary nothing foo.png
* 2: +403/-35 +1/-1 git-add--interactive.perl
```
要刪除選擇,在輸入的選項前添加`-`,如下所示:
```
Update>> -2
```
完成選擇后,輸入空行以暫存選中路徑在工作樹中的內容到暫存區中。
```
revert
```
這與_update_具有非常相似的UI,所選路徑的暫存信息被恢復為HEAD版本的信息。恢復新路徑將使它們不被跟蹤。
```
add untracked
```
這與_update_和*revert* 具有非常相似的UI,并允許您向暫存區添加未跟蹤的路徑。
```
patch
```
這使您可以像選擇器一樣選擇_*status*_中的一個路徑。選擇路徑后,它會顯示暫存區和工作樹文件之間的差異,并詢問您是否要暫存各個部分的變動。您可以選擇以下選項之一并鍵入return:
```
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
```
在對所有部分進行選擇之后,如果有任何部分被選中,則將所選的部分更新到暫存區。
通過將配置變量`interactive.singleKey`設置為`true`,即可不必在此處鍵入return。
```
diff
```
此命令可以查看將要提交的內容(即HEAD和暫存區之間)。
## 編輯補丁
調用`git add -e`或從交互式塊選擇器中選擇`e`,將在編輯器中打開補丁;退出編輯器后,結果將應用于暫存區。您可以隨意對修補程序進行任意更改,但請注意,某些更改可能會導致令人困惑的結果,甚至會產生無法應用的修補程序。如果要完全中止操作(即,在暫存區中不做任何更新),只需刪除修補程序的所有行。以下內容列出了您可能在修補程序中看到的一些常見內容,以及哪些編輯操作對它們有意義。
```
added content
```
添加的內容由以“+”開頭的行表示。您可以通過刪除它們來阻止暫存任何添加行。
```
removed content
```
刪除的內容由以“ - ”開頭的行表示。您可以通過將“ - ”轉換為“ ”(空格)來阻止刪除它們。
```
modified content
```
修改后的內容由“ - ”行(刪除舊內容)后跟“+”行(添加替換內容)表示。您可以通過將“ - ”行轉換為“ ”并刪除“+”行來阻止暫存修改。請注意,僅修改其中的一半可能會引入異常的更改到暫存區。
還可以執行更復雜的操作。但要注意,因為補丁僅應用于暫存區而不是工作樹,所以工作樹將不執行索引中的更改。例如,向暫存區中引入的HEAD和工作樹中都不存在的新行將作用于commit(提交),但該行將在工作樹中還原。
需要避免或非常謹慎地使用這些結構。
```
removing untouched content
```
索引和工作樹之間沒有差異的內容可以在上下文行中顯示,以“ ”(空格)開頭。您可以通過將空格轉換為“ - ”來刪除上下文行。生成的工作樹文件將重新添加這些內容。
```
modifying existing content
```
還可以通過刪除(將“ ”轉換為“ - ”)和添加添加新內容到“+”行來修改上下文行。類似地,可以修改“+”行以用于現有的添加或修改。在所有情況下,新修改將在工作樹中還原。
```
new content
```
您還可以添加補丁中不存在的新內容;只需添加新行,每行以“+”開頭。添加將在工作樹中還原。
還有一些操作應該完全避免,因為它們會使補丁無法應用:
* 添加上下文(“ ”)或刪除(“ - ”)行
* 刪除上下文或刪除行
* 修改上下文或刪除行的內容
## 也可以看看
[git-status [1]](https://git-scm.com/docs/git-status) [git-rm [1]](https://git-scm.com/docs/git-rm) [git-reset [1]](https://git-scm.com/docs/git-reset) [git-mv [1]](https://git-scm.com/docs/git-mv) [git-commit [1]](https://git-scm.com/docs/git-commit) [git-update-index [1]](https://git-scm.com/docs/git-update-index)
## GIT
部分 [git [1]](https://git-scm.com/docs/git) 套件
- git
- git-config
- git-help
- git-init
- git-clone
- git-add
- git-status
- git-diff
- git-commit
- git-reset
- git-rm
- git-mv
- git-branch
- git-checkout
- git-merge
- git-mergetool
- git-log
- git-stash
- git-tag
- git-worktree
- git-fetch
- git-pull
- git-push
- git-remote
- git-submodule
- git-show
- git-log
- git-shortlog
- git-describe
- git-apply
- git-cherry-pick
- git-rebase
- git-revert
- git-bisect
- git-blame
- git-grep
- gitattributes
- giteveryday
- gitglossary
- githooks
- gitignore
- gitmodules
- gitrevisions
- gittutorial
- gitworkflows
- git-am
- git-format-patch
- git-send-email
- git-request-pull
- git-svn
- git-fast-import
- git-clean
- git-gc
- git-fsck
- git-reflog
- git-filter-branch
- git-instaweb
- git-archive
- git-bundle
- git-daemon
- git-update-server-info
- git-cat-file
- git-check-ignore
- git-checkout-index
- git-commit-tree
- git-count-objects
- git-diff-index
- git-for-each-ref
- git-hash-object
- git-ls-files
- git-merge-base
- git-read-tree
- git-rev-list
- git-rev-parse
- git-show-ref
- git-symbolic-ref
- git-update-index
- git-update-ref
- git-verify-pack
- git-write-tree