簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-add 上次更新於 2.48.0

名稱

git-add - 新增檔案內容到索引

概要

git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
	[--edit | -e] [--[no-]all | -A | --[no-]ignore-removal | [--update | -u]] [--sparse]
	[--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--renormalize]
	[--chmod=(+|-)x] [--pathspec-from-file=<file> [--pathspec-file-nul]]
	[--] [<pathspec>…​]

描述

此命令使用工作樹中找到的當前內容更新索引,以準備下一次提交的暫存內容。它通常會整體新增現有路徑的當前內容,但透過一些選項,它也可以用於新增僅應用了對工作樹檔案部分更改的內容,或刪除工作樹中不再存在的路徑。

“索引”儲存了工作樹內容的快照,正是此快照被用作下一次提交的內容。因此,在對工作樹進行任何更改之後,以及在執行 commit 命令之前,您必須使用 add 命令將任何新建或修改的檔案新增到索引中。

此命令可以在提交前執行多次。它只在執行 add 命令時新增指定檔案的內容;如果您希望將後續更改包含在下一次提交中,則必須再次執行 git add 以將新內容新增到索引中。

git status 命令可用於獲取哪些檔案有更改且已暫存以供下次提交的摘要。

git add 命令預設不會新增被忽略的檔案。如果命令列上明確指定了任何被忽略的檔案,git add 將失敗並列出被忽略的檔案。透過 Git 執行的目錄遞迴或檔名萬用字元(在 shell 之前引用您的萬用字元)找到的被忽略檔案將被靜默忽略。git add 命令可以使用 -f (force) 選項來新增被忽略的檔案。

有關將內容新增到提交的替代方法,請參閱 git-commit[1]

選項

<pathspec>...

要新增內容的檔案。可以使用檔案萬用字元(例如 *.c)來新增所有匹配的檔案。還可以給定一個開頭的目錄名(例如 dir 來新增 dir/file1dir/file2),以更新索引來匹配目錄的整體當前狀態(例如,指定 dir 不僅會記錄工作樹中修改過的檔案 dir/file1,工作樹中新增的檔案 dir/file2,還會記錄工作樹中刪除的檔案 dir/file3)。請注意,舊版本的 Git 曾經會忽略已刪除的檔案;如果您想新增修改過的或新建的檔案但忽略已刪除的檔案,請使用 --no-all 選項。

有關 <pathspec> 語法的更多詳細資訊,請參閱 gitglossary[7] 中的 pathspec 條目。

-n
--dry-run

不實際新增檔案,僅顯示它們是否存在以及/或是否會被忽略。

-v
--verbose

顯示詳細資訊。

-f
--force

允許新增原本被忽略的檔案。

--sparse

允許更新稀疏檢出錐體之外的索引條目。通常,git add 拒絕更新其路徑不符合稀疏檢出錐體的索引條目,因為這些檔案可能會在沒有警告的情況下從工作樹中刪除。有關更多詳細資訊,請參閱 git-sparse-checkout[1]

-i
--interactive

以互動方式將工作樹中修改過的內容新增到索引。可以提供可選的路徑引數以將操作限制為工作樹的一個子集。有關詳細資訊,請參閱“互動模式”。

-p
--patch

互動式地選擇索引和工作樹之間的補丁塊(hunks),並將其新增到索引中。這讓使用者有機會在將修改過的內容新增到索引之前審查差異。

這實際上運行了 add --interactive,但繞過了初始命令選單,直接跳轉到 patch 子命令。有關詳細資訊,請參閱“互動模式”。

-e
--edit

在編輯器中開啟與索引的差異,並允許使用者編輯它。編輯器關閉後,調整補丁塊標題並將補丁應用到索引。

此選項的目的是選擇要應用的補丁行,甚至修改要暫存的行內容。這比使用互動式補丁塊選擇器更快捷、更靈活。然而,很容易混淆自己並建立無法應用到索引的補丁。請參閱下面的“編輯補丁”。

-u
--update

僅更新索引中已存在匹配 <pathspec> 的條目。這會刪除並修改索引條目以匹配工作樹,但不新增任何新檔案。

如果使用 -u 選項時未給定 <pathspec>,則會更新整個工作樹中所有已跟蹤的檔案(舊版本的 Git 曾經將更新限制在當前目錄及其子目錄)。

-A
--all
--no-ignore-removal

不僅在工作樹中有檔案匹配 <pathspec> 的地方更新索引,而且在索引中已存在條目的地方也更新。這會新增、修改和刪除索引條目以匹配工作樹。

如果使用 -A 選項時未給定 <pathspec>,則會更新整個工作樹中所有檔案(舊版本的 Git 曾經將更新限制在當前目錄及其子目錄)。

--no-all
--ignore-removal

透過新增索引中未知的新檔案和工作樹中修改過的檔案來更新索引,但忽略已從工作樹中刪除的檔案。當未使用 <pathspec> 時,此選項是空操作。

此選項主要是為了幫助習慣舊版本 Git 的使用者,舊版本 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 add 在不使用 git submodule add 建立 .gitmodules 中的條目而將嵌入式倉庫新增到索引時會發出警告。此選項將抑制該警告(例如,如果您正在手動對子模組執行操作)。

--renormalize

將“清理”過程重新應用於所有已跟蹤檔案,以強制將它們再次新增到索引。這在更改 core.autocrlf 配置或 text 屬性後很有用,以便糾正使用錯誤 CRLF/LF 行尾符新增的檔案。此選項隱含 -u。單獨的 CR 字元保持不變,因此 CRLF 清理為 LF,而 CRCRLF 序列只會被部分清理為 CRLF

--chmod=(+|-)x

覆蓋新增檔案的可執行位。可執行位僅在索引中更改,磁碟上的檔案保持不變。

--pathspec-from-file=<file>

路徑規範(pathspec)在 <file> 中傳遞,而不是命令列引數。如果 <file> 恰好是 -,則使用標準輸入。路徑規範元素由 LFCR/LF 分隔。路徑規範元素可以像配置變數 core.quotePath 所解釋的那樣引用(參見 git-config[1])。另請參閱 --pathspec-file-nul 和全域性 --literal-pathspecs

--pathspec-file-nul

僅在與 --pathspec-from-file 一起使用時有意義。路徑規範元素由 NUL 字元分隔,所有其他字元都被視為字面值(包括換行符和引號)。

--

此選項可用於將命令列選項與檔案列表分開(當檔名可能被誤認為是命令列選項時很有用)。

示例

  • 新增 Documentation 目錄及其子目錄下所有 *.txt 檔案的內容

    $ git add Documentation/\*.txt

    請注意,在此示例中,星號 * 已被 shell 引用;這使得命令能夠包含 Documentation/ 目錄子目錄中的檔案。

  • 考慮新增所有 git-*.sh 指令碼中的內容

    $ git add git-*.sh

    因為此示例允許 shell 展開星號(即您明確列出檔案),所以它不考慮 subdir/git-foo.sh

互動模式

當命令進入互動模式時,它會顯示 status 子命令的輸出,然後進入其互動式命令迴圈。

命令迴圈會顯示可用子命令列表,並給出提示“What now> ”。通常,當提示以單個 > 結尾時,您只能從給定的選項中選擇一個並按回車,例如

    *** Commands ***
      1: status       2: update       3: revert       4: add untracked
      5: patch        6: diff         7: quit         8: help
    What now> 1

只要選擇是唯一的,您也可以說 sstastatus

主命令迴圈有 6 個子命令(加上 help 和 quit)。

status

這顯示了 HEAD 和索引之間的更改(即如果您執行 git commit 將提交的內容),以及每個路徑的索引和工作樹檔案之間的更改(即您可以在 git commit 之前使用 git add 進一步暫存的內容)。示例輸出如下:

              staged     unstaged path
     1:       binary      nothing foo.png
     2:     +403/-35        +1/-1 add-interactive.c

它顯示 foo.pngHEAD 存在差異(但由於是二進位制檔案,無法顯示行數),並且索引副本和工作樹版本之間沒有差異(如果工作樹版本也不同,則會顯示 binary 而不是 nothing)。另一個檔案 add-interactive.c,如果您提交索引中的內容,則有 403 行新增和 35 行刪除,但工作樹檔案有進一步的修改(一次新增和一次刪除)。

update

這會顯示狀態資訊併發出“Update>>”提示。當提示以雙 >> 結尾時,您可以進行多項選擇,用空格或逗號連線。您也可以指定範圍。例如,“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 add-interactive.c

要取消選擇,請在輸入前加上 -,如下所示:

Update>> -2

做出選擇後,以空行應答以將工作樹檔案中選定路徑的內容暫存到索引中。

revert

這與 update 有非常相似的使用者介面,所選路徑的暫存資訊將恢復為 HEAD 版本。恢復新路徑會使它們變為未跟蹤狀態。

add untracked

這與 updaterevert 有非常相似的使用者介面,允許您將未跟蹤的路徑新增到索引。

patch

這允許您從類似 status 的選擇中選擇一個路徑。選擇路徑後,它會顯示索引和工作樹檔案之間的差異,並詢問您是否要暫存每個補丁塊(hunk)的更改。您可以選擇以下選項之一併按回車

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
p - print the current hunk
? - print help

在決定所有補丁塊的去留後,如果選擇了任何補丁塊,則索引將根據所選的補丁塊進行更新。

透過將配置變數 interactive.singleKey 設定為 true,您可以省略在此處輸入回車。

diff

這讓您可以檢視將要提交的內容(即 HEAD 和索引之間)。

編輯補丁

呼叫 git add -e 或從互動式補丁塊選擇器中選擇 e 將在您的編輯器中開啟一個補丁;編輯器退出後,結果將應用於索引。您可以隨意對補丁進行更改,但請注意,某些更改可能會導致混亂的結果,甚至導致補丁無法應用。如果您想完全中止操作(即不在索引中暫存任何新內容),只需刪除補丁的所有行。下面的列表描述了您在補丁中可能會看到的一些常見內容,以及哪些編輯操作對它們有意義。

新增的內容

新增的內容由以“+”開頭的行表示。您可以透過刪除任何新增行來阻止其暫存。

刪除的內容

刪除的內容由以“-”開頭的行表示。您可以透過將“-”轉換為“ ”(空格)來阻止其刪除的暫存。

修改的內容

修改後的內容由“-”行(刪除舊內容)和隨後的“+”行(新增替換內容)表示。您可以透過將“-”行轉換為“ ”並刪除“+”行來阻止修改的暫存。請注意,只修改配對中的一半可能會給索引帶來令人困惑的更改。

還可以執行更復雜的操作。但請注意,由於補丁僅應用於索引而非工作樹,工作樹將顯得“撤銷”索引中的更改。例如,在索引中引入一條既不在 HEAD 也不在工作樹中的新行,將暫存該新行以供提交,但該行在工作樹中將顯示為已恢復。

避免使用這些結構,或極其謹慎地使用。

刪除未觸及的內容

索引和工作樹之間沒有區別的內容可能會顯示在上下文行中,以“ ”(空格)開頭。您可以透過將空格轉換為“-”來暫存上下文行以進行刪除。結果工作樹檔案將顯示為重新添加了內容。

修改現有內容

還可以透過將上下文行暫存以進行刪除(透過將“ ”轉換為“-”)並新增包含新內容的“+”行來修改它們。類似地,可以修改現有新增或修改的“+”行。在所有情況下,新修改將在工作樹中顯示為已恢復。

新內容

您也可以新增補丁中不存在的新內容;只需新增新行,每行以“+”開頭。新增的內容將在工作樹中顯示為已恢復。

還有一些操作應完全避免,因為它們將使補丁無法應用

  • 新增上下文(“ ”)或刪除(“-”)行

  • 刪除上下文或刪除行

  • 修改上下文或刪除行的內容

配置

本節中以下所有內容均從 git-config[1] 文件中選擇性地包含。內容與彼處相同:

add.ignoreErrors
add.ignore-errors (已廢棄)

指示 git add 在某些檔案因索引錯誤而無法新增時繼續新增檔案。等同於 --ignore-errors 選項。add.ignore-errors 已廢棄,因為它不遵循配置變數的常規命名約定。

Git

Git[1] 套件的一部分

scroll-to-top