今までgit addするときはgit add .をずっと使ってきたのだが、-Aと-uとの違いがわからなかったので調べてみた。

バージョン

Git for Windows2.13.0

ヘルプで確認

とりあえずヘルプで-Aと-uを確認。

$ git help add

-A
–all
–no-ignore-removal
Update the index not only where the working tree has a file matching <pathspec> but also where the index already has an entry. This adds, modifies, and removes index entries to match the working tree.

If no <pathspec> is given when -A option is used, all files in the entire working tree are updated (old versions of Git used to limit the update to the current directory and its subdirectories).

-u
–update
Update the index just where it already has an entry matching <pathspec>. This removes as well as modifies index entries to match the working tree, but adds no new files.

If no <pathspec> is given when -u option is used, all tracked files in the entire working tree are updated (old versions of Git used to limit the update to the current directory and its subdirectories).

英語は苦手なので翻訳しながら確認した。
たぶん以下であってると思う。

  • -Aは作業ツリーの追加、変更、削除ファイルすべて対象
  • -uは追跡ファイル(git管理ファイル)の変更、削除ファイルが対象

ただし、赤字の箇所に書いてあるように-A、-uともに古いGitではカレントディレクトリ配下のみ対象だったようだ。

現段階の最新のGitで確認してみる。

ファイル作って確認

以下のようなファイル構成のプロジェクトを用意する。

b.txt  
c.txt  
dir1  (ディレクトリ)  
└─ d.txt

ここで追加(a.txt)、変更(b.txt)、削除(d/d.txt)を行う。

$ echo a > a.txt
$ echo b >> b.txt
$ rm dir1/d.txt  
$ git status -s
 M b.txt
 D dir1/d.txt
?? a.txt
  • git add .の場合

    $ git add .
    $ git status -s
    A  a.txt
    M  b.txt
    D  dir1/d.txt
    
  • git add -Aの場合

    $ git add -A
    $ git status -s
    A  a.txt
    M  b.txt
    D  dir1/d.txt
    
  • git add -uの場合

    $ git add -u
    $ git status -s
    M  b.txt
    D  dir1/d.txt
    ?? a.txt
    

    結果

    • git add .  -> 追加、変更、削除ファイルすべてが追加される
    • git add -A -> 追加、変更、削除ファイルすべてが追加される
    • git add -u -> 変更、削除ファイルが追加され、追加ファイルは追加されない

カレントディレクトリをサブディレクトリに変えてみる

 $ cd dir1
  • git add .の場合

    $ git status -s
     M ../b.txt
    D  d.txt
    ?? ../a.txt
    
  • git add -Aの場合

    $ git add -A
    $ git status -s
    A  ../a.txt
    M  ../b.txt
    D  d.txt
    

    結果

    • git add .  -> カレントディレクトリのファイルのみ追加される
    • git add -A -> すべてのファイルが追加される

まとめ

git add .とgit add -Aではカレントディレクトリがルートディレクトリではなくサブディレクトリの場合に挙動が異なる。
ただ、git bashでは基本的にルートディレクトリで作業するので(私の場合)すべてのファイルを追加するときはgit add .で問題なさそう。
git管理外のファイルがありgit管理のファイルのみaddする場合はgit add -uを使えばよい。