「git add -A」と「git add」の違い。


2918

コマンドgit add [--all|-A]はと同じように見えますgit add .。これは正しいです?そうでない場合、それらはどのように異なりますか?

回答:


4242

この回答は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

41
どう違いgit add *ますか?
Jared

3
あまりにも悪いgit add -A -pことは期待どおりに機能しません(追跡されていないファイルについて対話形式で尋ねます)
Erik Kaplun

2
回答を更新してください。それは:git add -A :/またはgit add -A .
Gabriel Llamas

5
ちなみに、新しいバージョンのgit git add -uではgit add -u :/、後者のパラメーターがパスになり、特定のディレクトリを-uできるようになり:/、ツリー全体を処理します。
Brizee

15
@ CharlesBailey、Gitは、理由もなく複雑化するのが大好きです。同期の問題がないことを確認するために追加された精神的税金を考慮した後でも、誰かが具体的に必要とする、またはそうすることによって彼の人生を容易にする実際のユースケースはありますか?Gitが2つの個別のコマンドにさらに分割せず、1つが数字で始まるファイルで機能し、もう1つが数字以外で始まるファイルで機能するgit add -ugit add .add -uadd -u1add-u2
理由

946

以下は、すぐに理解できる表です。

Gitバージョン1.x

ここに画像の説明を入力してください

Gitバージョン2.x

ここに画像の説明を入力してください

長い形式のフラグ:

  • git add -A に相当 git add --all
  • git add -u に相当 git add --update

参考文献:


1
テーブルをありがとう。変更されたファイルのみを追加する方法はありますか?新しいファイルや削除されたファイルはありません
Gokul NK、2015

3
@Gokul:この投稿によると、を使用git diff-files -z --diff-filter=M --name-only | xargs -0 git addして変更されたファイルのみを追加でき、新しいファイルや削除は追加できません。
ヴィル

93
git add .現在のパス上にある新しいファイルを追加するだけなので、これは完全には当てはまりません。つまり、新しいディレクトリがある場合../foogit add -Aステージングしますが、しgit add .ません。
Milo Wielondek、2015

2
だから、git add .と等価であるgit add -A .に相当する、git add "*"
flow2k

私はまだgit add "*"について混乱していますが、もう少し詳しく説明してもらえますか?
HS Umer farooq 2018年

176

Git 2.0、git add -Aデフォルトである:git add .等しいですgit add -A .

git add <path>は「git add -A <path>」と同じなので、「git add dir/」はディレクトリから削除したパスに気づき、削除を記録します。
古いバージョンのGitでは、git add <path>」は削除を無視していました。

本当に必要な場合git add --ignore-removal <path><path>、「」と発声して、追加または変更されたパスのみをに追加できます。

git add -Aのようなものですgit add :/トップのgit repoフォルダからすべてを追加してください)。
git 2.7(2015年11月)では、:「」という名前のフォルダーを追加できることに注意してください。Junio C Hamano(によるコミット29abb33(2015年10月25日)を
参照してください。 gitster


なお、開始gitの2.0(Q1またはQ2 2014) 、について話したときにgit add .(作業ツリー内の電流パス)、あなたは「を使用しなければならない.他に」git add同様のコマンド。

つまり:

git add -A .」に相当します「git add .; git add -u .

(およびの余分な「.」に注意してくださいgit add -Agit add -u

そのためgit add -Aか、git add -u上の(唯一のgit 2.0以降)動作する全体の作業ツリーだけではなく、現在のパス上に。

これらのコマンドは、Git 2.0のツリー全体で機能し、「git commit -a」およびその他のコマンドとの整合性を保ちます。" git add -u"のように動作するメカニズムがないためgit add -u .、 " git add -u"(pathspecなしで)現在のサブディレクトリのパスのみのインデックスを更新することに慣れている人は、指でトレーニングを開始して明示的に言うことが重要ですgit add -u ."彼らがGit 2.0が登場する前にそれを意味するとき。

これらのコマンドがpathspecなしで実行され、現在のディレクトリ以外でローカルに変更があった場合、Git 2.0の動作はそのような状況では現在のバージョンと異なるため、警告が発行されます


3
@NickVolynkinいいね!SOの国際社会が意図したとおりに機能していることをうれしく思います。参考までに:ru.stackoverflow.com/a/431840
VonC

@VonC、ニース、Gitの人々は実際、彼らのアップデートが「物事をより一貫性のあるものにする」と言う頬を持っていました。彼らがやったことは、より多くの混乱と矛盾を生み出しています。26のアルファベットがあり、既に使用されているフラグを再利用する必要がありました。
Pacerier、

136

チャールズの指示から、私の提案した理解をテストした後、次のようになります:

# 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作業ディレクトリからの削除済みファイルの削除


6
これは2.0ではもう当てはまりません。追加 。同じパスに対して-Aを追加するのと同じです。唯一の違いは、ツリーの他のパスに新しいファイルがあるかどうかです
Claudiu Creanga '27

41

Git 2.0での変更点2014-05-28):

  • -A 現在はデフォルトです
  • 以前の動作は、 --ignore-removal
  • git add -uまたgit add -A、コマンドラインにパスのないサブディレクトリでは、ツリー全体を操作します。

したがって、Git 2の場合の答えは次のとおりです。

  • git add . そして git add -A .、現在のディレクトリに新しい/変更/削除されたファイル追加します
  • git add --ignore-removal . 現在のディレクトリに新しい/変更されたファイルを追加します
  • git add -u . 変更/削除されたファイルを現在のディレクトリに追加します
  • ドットがない場合、現在のディレクトリに関係なく、プロジェクト内のすべてのファイルを追加します。

4
これは正しいとは思いません。git v2.10.windows.2 'git add'を使用すると、「指定なし、追加なし」が返されます。'git add -A'は、変更されたすべてのファイルを追加します。これは、「-A」がデフォルトではないことを示唆しています。
ニュートリノ2017年

34

より蒸留された簡単な答え:

以下の両方を実行します(git add --allと同じ)

git add -A

新規および変更されたファイルをステージングします

git add .

変更されたステージと削除されたファイル

git add -u

5
こんにちは、変更されたファイルのみをステージングしたい場合はどうなりますか?どうしますか
TheGrapeBeyond 2014年

2
こんにちは、いい質問ですね。私が知る限り、そのための簡単なフラグはありません。git diff-files -z --diff-filter = M --name-only | xargsの-0からのgitアドオン- > stackoverflow.com/questions/14368093/...
K.キリアンリンドバーグ

2
実際にはgit add :/+git add -u :/
Nick Volynkin、2015

27

Gitの2.xの

  • あなたは、に直接配置されている場合、作業ディレクトリ、その後、git add -Aおよびgit add .差異のない仕事。

  • あなたは、任意のサブディレクトリにある場合は、作業ディレクトリgit add -A全体からすべてのファイルを追加します作業ディレクトリ、およびgit add .あなたからファイルを追加します、現在のディレクトリ

そして、それだけです。


12

これがさらに明確になることを願っています。

!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)

リミッターは-uまたは-Aまたはnilです。

pathspecは、ファイルパスまたはドット、「。」です。現在のディレクトリを示します。

Gitが「追加」する方法に関する重要な背景知識:

  • ドットが前に付いている不可視ファイル(dotfiles)は、Gitによって自動的に認識されることはありません。それらは「追跡されていない」と表示されることさえありません。
  • 空のフォルダーがGitによって追加されることはありません。それらは「追跡されていない」と表示されることさえありません。(回避策は、追跡されたファイルに空のファイルを追加することです)。
  • Gitのステータスには、サブフォルダーの情報が表示されません。つまり、そのサブフォルダー内の少なくとも1つのファイルが追跡されていない限り、追跡されていないファイルです。そのような時まで、Gitはフォルダー全体を範囲外と見なし、「空」とします。追跡されたアイテムは空です。
  • filespec = '。'の指定 (ドット)、または現在のディレクトリは、特に-A指定がない限り、再帰的ではありません。ドットは厳密に現在のディレクトリを参照します-上下にあるパスは省略されます。

今、その知識があれば、上記の答えを適用できます。

リミッターは以下の通りです。

  • -u= --update=追跡ファイルのサブセット=>追加=いいえ; 変更=はい。削除=はい。=> アイテムが追跡されている場合
  • -A= --all(そのような-aものはなく、構文エラーが発生します)=すべての追跡されていない/追跡されているファイルのスーパーセット。2.0より前のGitでない限り、ドットファイル指定が指定されている場合、その特定のフォルダーのみが考慮されます。=> アイテムが認識された場合git add -Aそれを見つけて追加します。

pathspecは次のとおりです。

  • 2.0より前のGitでは、2つのリミッター(更新とすべて)の場合、新しいデフォルトでは、現在のパス(Git 1.9以前)ではなく、作業ツリー全体を操作します。
  • ただし、v2.0では、操作を現在のパスに限定できます。明示的なドットサフィックスを追加するだけです(これはGit 1.9以前でも有効です)。

git add -A .

git add -u .

結論として、私の方針は:

  1. 追加するすべてのハンク/ファイルがで説明されていることを確認しgit statusます。
  2. 非表示のファイル/フォルダーが原因で不足しているアイテムがある場合は、それらを個別に追加します。
  3. .gitignore通常は対象のファイルのみが追跡されず、認識されないように、適切なファイルを用意します。
  4. リポジトリの最上位から「git add -A」を実行して、すべてのアイテムを追加します。これはGitのすべてのバージョンで機能します。
  5. 必要に応じて、インデックスからアイテムを削除します。
  6. 大きなバグがある場合は、「git reset」を実行して、インデックスを完全にクリアします。

12

git add .equals git add -A .は、現在のフォルダーと子フォルダーからのみインデックスにファイルを追加します。

git add -A 作業ツリーのすべてのフォルダからインデックスにファイルを追加します。

PS:情報はGit 2.0(2014-05-28)に関連しています


9

両方ともgit add .git add -AGitの新しいバージョンですべての新規、変更、削除されたファイルをステージングします。

違いはgit add -A、作業中のGitリポジトリに属する​​「上位、現在、およびサブディレクトリ」にファイルをステージングすることです。しかし、やってgit add .のみ(これを、次の現在のディレクトリ内のファイルやサブディレクトリをステージません外部にあるファイル上位ディレクトリ)で)。

次に例を示します。

/my-repo
  .git/
  subfolder/
    nested-file.txt
  rootfile.txt

現在の作業ディレクトリである場合は/my-repo、あなたがないrm rootfile.txt、そしてcd subfolder、続いてgit add .、それはなりません削除されたファイルをステージ。ただしgit add -A、どこからコマンドを実行しても、この変更は確実にステージングされます。


3

-Aオプションは、作業ツリーに一致するようにインデックスエントリを追加、変更、および削除します。

Git 2では、この-Aオプションがデフォルトになりました。

Gitのドキュメント.に従って、更新の範囲を現在のディレクトリに制限するa が追加された場合

<pathspec>-Aオプションの使用時にno を指定すると、作業ツリー全体のすべてのファイルが更新されます(古いバージョンのGitは、更新を現在のディレクトリとそのサブディレクトリに制限するために使用されていました)。

追加したいことの1つは、--interactiveor -pモードを使用git addすると、更新(-u)フラグを使用した場合と同様に動作し、新しいファイルを追加しないことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.