git add .,git add -A,git add -u,git add * 的區別與聯絡

語言: CN / TW / HK

考查知識點

  • Git 的使用

導讀

主要看開發中基礎工具的使用熟練度,以及在使用過程中是有自己的總結思考還是能用就行。

題解

這幾個命令在不同版本的 Git 中稍有差異。

對於 Git Version 1.x:

  1. git add .:會將當前工作區中當前目錄(包括子目錄)下的所有新檔案和對已有檔案的改動提交至暫存區,但不包括被刪除的檔案。
  2. git add -ugit add --update 的簡寫形式,它只會監控當前整個工作區中之前已被 add 的檔案,即已被跟蹤(tracked)的檔案,也就是隻會將當前整個工作區中被修改和被刪除的檔案提交至暫存區。而新檔案因為未被跟蹤(untracked),所以不會被提交至暫存區。
  3. git add -Agit add --all 的簡寫形式,它會將當前整個工作區中所有的檔案改動提交至暫存區,包括新增、修改和被刪除的檔案,不受當前所在目錄限制。

注意:你會看到有些文章說 git add -A 屬於 git add .git add -u 功能的合集,這是不對的。因為 git add . 只會提交當前目錄(包括子目錄)下的新檔案和對已有檔案的改動,而 git add -A 不受當前目錄限制。也就是說,git add .git add -u 功能的合集只能屬於 git add -A 功能的子集。

總結詳見下圖:

| Git Version 1.x | 新檔案 | 被修改的檔案 | 被刪除的檔案 | 是否受當前所在目錄限制 | 說明 | |:----------------|:-----:|:----------:|:----------:|--------------------|-----| | git add -A. | ✅ | ✅ | ✅ | ❌ | 將當前整個工作區中所有的檔案改動提交至暫存區,包括新增、修改和被刪除的檔案,不受當前所在目錄限制 | | git add . | ✅ | ✅ | ❌ | ✅ | 將當前工作區中當前目錄(包括子目錄)下的所有新檔案和對已有檔案的改動提交至暫存區,但不包括被刪除的檔案 | | git add -u. | ❌ | ✅ | ✅ | ❌ | 將當前整個工作區中被修改和被刪除的檔案提交至暫存區。而新檔案因為未被跟蹤(untracked),所以不會被提交至暫存區 |

對於 Git Version 2.x:

在 Git --version 2.x 中對 git add . 的功能做了改動,git add . 會提交當前工作區中當前目錄(包括子目錄)下所有的檔案改動,不像在 Git --version 1.x 時那樣不包括被刪除的檔案。

Git Version 2.x 中如果想在使用 git add . 時不提交被刪除的檔案,可以使用 git add --ignore-removal 加上匹配符 .,即 git add --ignore-removal .

git add --ignore-removal 後的匹配符是可以更換的(但不能預設),例如 git add --ignore-removal -A 可以實現在 git add -A 時不提交被刪除的檔案。

有些文章說在 Git --version 2.x 中 git add .git add -A 的功能變得完全相同,這是不對的。因為我們之前提到過,git add . 提交的檔案改動受當前所在目錄限制,它只會提交當前工作區中當前目錄(包括子目錄)下的檔案改動,而 git add -A 不受當前所在目錄的限制,提交的是當前整個工作區中所有的檔案改動。

git add *

git add * 表示添加當前目錄(包括子目錄)下的所有檔案改動,但不包括檔名以 . 符號開頭的檔案的改動。這是 Shell 命令,git 只是接收檔案列表。而 git add . 的功能與 git add * 基本相同,只是 git add . 會將檔名以 . 符號開頭的檔案的改動也提交至暫存區。

總結詳見下圖:

| Git Version 2.x | 新檔案 | 被修改的檔案 | 被刪除的檔案 | 是否受當前所在目錄限制 | 說明 | |:----------------|:-----:|:----------:|:----------:|--------------------|-----| | git add -A | ✅ | ✅ | ✅ | ❌ | 將當前整個工作區中所有的檔案改動提交至暫存區,包括新增、修改和被刪除的檔案,不受當前所在目錄限制 | | git add . | ✅ | ✅ | ❌ | ✅ | 將當前工作區中當前目錄(包括子目錄)下的所有的檔案改動提交至暫存區,包括新增、修改和被刪除的檔案 | | git add -u. | ❌ | ✅ | ✅ | ❌ | 將當前整個工作區中被修改和被刪除的檔案提交至暫存區。而新檔案因為未被跟蹤(untracked),所以不會被提交至暫存區 | | git add * | ❌ | ✅ | ✅ | ✅ | 將當前工作區中當前目錄(包括子目錄)下的所有的檔案改動提交至暫存區,包括新增、修改和被刪除的檔案,但不包括檔名以 . 符號開頭的檔案的改動 |

結語

我是 LeviDing,一名正在進階的前端程式設計師。你可以在 掘金 關注我。 也可以在 微信公眾號:技術漫談 找到我。

我們一起學習,共同成長!