コマンドgit add [--all|-A]
はと同じように見えますgit add .
。これは正しいです?そうでない場合、それらはどのように異なりますか?
11 に答える
この回答は、 Git バージョン 1.xにのみ適用されます。Git バージョン 2.x については、他の回答を参照してください。
概要:
git add -A
すべての変更をステージングgit add .
(現在のディレクトリとそのサブディレクトリで)削除せずに、新しいファイルと変更をステージングします。git add -u
新しいファイルなしで、段階的な変更と削除
詳細:
git add -A
と同等 git add .; git add -u
です。
重要な点git add .
は、作業ツリーを見て、それらが変更されているか、新しくて無視されていない場合は、ステージングされた変更にすべてのパスを追加し、「rm」アクションをステージングしないことです。
git add -u
は、すでに追跡されているすべてのファイルを調べて、それらのファイルが異なる場合、または削除されている場合、それらのファイルへの変更をステージングします。新しいファイルを追加するのではなく、既に追跡されているファイルへの変更をステージングするだけです。
git add -A
これらの両方を行うための便利なショートカットです。
次のような方法で違いをテストできます (Git バージョン 2.x の場合、出力が異なることに注意してくださいgit add .
git status
)。
git init
echo Change me > change-me
echo Delete me > delete-me
git add change-me delete-me
git commit -m initial
echo OK >> change-me
rm delete-me
echo Add me > add-me
git status
# Changed but not updated:
# modified: change-me
# deleted: delete-me
# Untracked files:
# add-me
git add .
git status
# Changes to be committed:
# new file: add-me
# modified: change-me
# Changed but not updated:
# deleted: delete-me
git reset
git add -u
git status
# Changes to be committed:
# modified: change-me
# deleted: delete-me
# Untracked files:
# add-me
git reset
git add -A
git status
# Changes to be committed:
# new file: add-me
# modified: change-me
# deleted: delete-me
Git バージョン 1.x
指示 | 新しいファイル | 変更されたファイル | 削除されたファイル | 説明 |
---|---|---|---|---|
git add -A |
✔️ | ✔️ | ✔️ | すべての (新規、変更済み、削除済み) ファイルをステージングする |
git add . |
✔️ | ✔️ | ❌</td> | 新しいファイルと変更されたファイルのみを現在のフォルダーにステージングする |
git add -u |
❌</td> | ✔️ | ✔️ | 変更および削除されたファイルのみをステージングする |
Git バージョン 2.x
指示 | 新しいファイル | 変更されたファイル | 削除されたファイル | 説明 |
---|---|---|---|---|
git add -A |
✔️ | ✔️ | ✔️ | すべての (新規、変更済み、削除済み) ファイルをステージングする |
git add . |
✔️ | ✔️ | ✔️ | 現在のフォルダー内のすべての (新規、変更済み、削除済み) ファイルをステージングする |
git add --ignore-removal . |
✔️ | ✔️ | ❌</td> | 新規および変更されたファイルのみをステージングする |
git add -u |
❌</td> | ✔️ | ✔️ | 変更および削除されたファイルのみをステージングする |
長い形式のフラグ:
git add -A
と同等ですgit add --all
git add -u
と同等ですgit add --update
参考文献:
チャールズの指示から、私の提案した理解をテストした後、次のようになります。
# For the next commit
$ git add . # Add only files created/modified to the index and not those deleted
$ git add -u # Add only files deleted/modified to the index and not those created
$ git add -A # Do both operations at once, add to all files to the index
このブログ投稿も、これらのコマンドが適用される状況を理解するのに役立つ場合があります。 Git 作業ディレクトリから削除されたファイルを削除します。
より洗練された簡単な答え:
以下の両方を実行します ( git add --allと同じ)
git add -A
新しいファイルと変更されたファイルのステージング
git add .
変更された + 削除されたファイルのステージ
git add -u
git add .
equalsgit add -A .
は、現在のフォルダーと子フォルダーからのみファイルをインデックスに追加します。
git add -A
作業ツリー内のすべてのフォルダーからインデックスにファイルを追加します。
PS: Git 2.0 (2014-05-28)に関する情報です。
これにより、さらに明確になることを願っています。
!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)
リミッターは -u または -A または nil です。
Pathspec は、ファイルパスまたはドット「.」の場合があります。現在のディレクトリを示します。
Git がどのように「追加」するかについての重要な背景知識:
- 目に見えないファイル、つまりドットで始まるファイル (ドットファイル) は、Git によって自動的に認識されることはありません。それらは「未追跡」としてリストされることさえありません。
- 空のフォルダーが Git によって追加されることはありません。それらは「未追跡」としてリストされることさえありません。(回避策は、追跡されたファイルに、おそらく非表示の空のファイルを追加することです。)
- サブフォルダー内の少なくとも 1 つのファイルが追跡されていない限り、Git ステータスはサブフォルダー情報 (つまり、追跡されていないファイル) を表示しません。その前に、Git はフォルダー全体を範囲外、つまり「空」と見なします。追跡項目がありません。
- filespec = '.' の指定 (ドット)、または現在のディレクトリは、指定されていない限り再帰的ではありません
-A
。ドットは現在のディレクトリを厳密に参照します。上下にあるパスは省略されます。
さて、その知識があれば、上記の答えを適用できます。
リミッターは以下の通りです。
-u
=--update
= 追跡ファイルへのサブセット => 追加 = いいえ; 変更 = はい; 削除 = はい。=>アイテムが追跡されている場合。-A
=--all
(no-a
such , これにより構文エラーが発生します) = 追跡されていない/追跡されているすべてのファイルのスーパーセット。2.0 より前の Git では、ドット filespec が指定されている場合は、その特定のフォルダーのみが考慮されます。=>アイテムが認識された場合git add -A
、それを見つけて追加します。
パススペックは以下の通りです。
- 2.0 より前の Git では、2 つのリミッター (update と all) の新しいデフォルトは、現在のパス (Git 1.9 以前) ではなく、作業ツリー全体を操作することです。
- ただし、v2.0 では、操作を現在のパスに限定できます。明示的なドット サフィックスを追加するだけです (これは Git 1.9 以前でも有効です)。
git add -A .
git add -u .
結論として、私のポリシーは次のとおりです。
- 追加するすべてのハンク/ファイルが で考慮されていることを確認してください
git status
。 - 非表示のファイル/フォルダーが原因でアイテムが欠落している場合は、それらを個別に追加します。
.gitignore
通常、関心のあるファイルのみが追跡されず、認識されないように、適切なファイルを用意します。- リポジトリの最上位から、「git add -A」を実行してすべてのアイテムを追加します。これは、Git のすべてのバージョンで機能します。
- 必要に応じて、必要なアイテムをインデックスから削除します。
- 大きなバグがある場合は、'git reset' を実行してインデックスを完全にクリアしてください。
この-A
オプションは、作業ツリーに一致するようにインデックス エントリを追加、変更、および削除します。
Git 2 では、この-A
オプションがデフォルトになりました。
Git のドキュメント.
に従って、更新の範囲を現在のディレクトリに制限する が追加された場合
-A オプションを使用するときにno
<pathspec>
を指定すると、作業ツリー全体のすべてのファイルが更新されます (Git の古いバージョンでは、更新を現在のディレクトリとそのサブディレクトリに制限するために使用されていました)。
追加したいことの 1 つは、--interactive
or-p
モードを使用git add
すると、 update ( -u
) フラグが使用されたかのように動作し、新しいファイルを追加しないことです。