web-dev-qa-db-ja.com

"git add -A"と "git add"の違い

コマンドgit add [--all|-A]git add .と同一のようです。これは正しいです?そうでなければ、どう違うのでしょうか。

2595
cmcginty

この答えはGit version 1.xにのみ適用されます。 Gitバージョン2.xの場合は、他の回答を参照してください。


要約:

  • git add -Aステージすべての変更

  • git add .は新しいファイルと変更をステージングします、削除なし

  • git add -uは変更と削除を段階的に行います、新しいファイルなしで


詳細:

git add -Agit add .; git add -uと同等です。

git add .に関する重要な点は、それがワーキングツリーを見て、それらが変更されたか新しいか無視されていない場合、段階的な変更にそれらすべてのパスを追加することです。

git add -uは、すべての already で追跡されているファイルを調べ、それらが異なっていたり削除されている場合はそれらのファイルへの変更をステージングします。新しいファイルは追加されず、すでに追跡されているファイルへの変更がステージングされるだけです。

git add -Aは、両方を実行するための便利なショートカットです。

この違いをテストすることができます(Gitバージョン2.xではgit add .git statuswillの出力は異なることに注意してください)。

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
3891
CB Bailey

簡単に理解するための表です。

Gitバージョン1.x : enter image description here

Gitバージョン2.x : enter image description here

長形式フラグ

  • git add -Agit add --allと同等です
  • git add -ugit add --updateと同等です

続きを読む:

772
Developer

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 addgit add :/のようなものです( トップのgitリポジトリからすべて追加 )。
git 2.7(2015年11月)では、 ":"という名前のフォルダーを追加できるようになります。
commit 29abb33 (2015年10月25日)/ Junio C Hamano(gitster を参照。


git 2.0(2014年第1四半期または第2四半期)git add .(作業ツリー内の現在のパス)について話すときは、他の.コマンドでも 'git add'を使用する必要があります。

つまり、

"git add -A ."は "git add .; git add -u ."と同じです。

.git add -Aの余分な 'git add -u'に注意してください。)

なぜなら、git add -Aまたはgit add -uは、現在のパスだけではなく、 作業ツリー全体 に対して動作するからです(git 2.0以降のみ)。

これらのコマンドは "git commit -a"や他のコマンドとの一貫性のためにGit 2.0のツリー全体を操作します 。 "git add -u"を "git add -u ."のように動作させるメカニズムはないため、現在のサブディレクトリ内のパスのインデックスのみを "git add -u"で更新して指のトレーニングを開始することは重要です。 Git 2.0が登場する前に「git add -u .」と明示的に言ってください。

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

156
VonC

Charlesの指示 から、テスト後の私の提案された理解は次のようになります。

# 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作業ディレクトリから削除されたファイルを削除する

131
Richard

より簡潔な答え:

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

git add -A

新しいファイルと修正されたファイルの段階

git add .

変更されたファイルと削除されたファイルの段階

git add -u
33

ものが変わった Git 2.0では:

  • -Aがデフォルトになりました
  • 古い振る舞いは--ignore-removalで利用可能になりました
  • コマンドラインにパスがないサブディレクトリのgit add -ugit add -Aは、ツリー全体に作用します。

だからgit 2の答えは:

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

In Git 2.x

  • 作業ディレクトリ に直接いる場合は、git add -Agit add .は違いなく動作します。

  • 作業ディレクトリ のいずれかのサブディレクトリにいる場合、git add -A 作業ディレクトリ全体 からすべてのファイルを追加し、git add . 現在のディレクトリ からファイルを追加します。

そしてそれだけです。

23
simhumileco

最後に、私はこれを手に入れたと思います、皆さんありがとうございました。私はこれがもう少し明確さを加えるかもしれないと思います。

!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 =追跡対象ファイルのサブセット=> Add = No。変更=はい。削除=はい=>アイテムが追跡されている場合。
  • -A = --all(そのような-aは使用できず、構文エラーが発生します)= Git <2.0の場合を除いて、追跡されていない/追跡されたすべてのファイルのスーパーセット。 =>アイテムが認識された場合、git add -Aはそれを見つけて追加します。

Pathspecは次のとおりです。

  • Git <2.0では、2つのリミッター(updateとall)では、新しいデフォルトは現在のパス(git <= 1.9)ではなく、作業ツリー全体を操作します。
  • しかし、v2.0では、操作を現在のパスに限定することができます。明示的なドットサフィックスを追加するだけです(これはGit <= 1.9でも有効です)。

git add -A .

git add -u .

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

  • 1.追加するハンク/ファイルがgitステータスであることを確認します。
  • 1A。見えないファイル/フォルダがあるために不足しているアイテムがある場合は、それらを別々に追加します。
  • 2.通常、関心のあるファイルだけが追跡されず、認識されないように、良いgitignoreを持ってください。
  • 3.リポジトリのトップレベルから、 "git add -A"を実行してすべての項目を追加します。これはすべてのバージョンのgitで機能します。
  • 4.必要に応じて、インデックスから必要な項目を削除します。
  • 6.大きなバグがある場合は、インデックスを完全に消去するために 'git reset'を実行してください。
11
AnneTheAgile

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

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

P.S .: Git 2.0に関する情報。

9
Alex78191

-Aオプションは、作業ツリーと一致するように索引項目を追加、変更、および削除します。

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

Gitドキュメンテーション のように、現在のディレクトリに更新の範囲を制限する.が追加された場合

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

私が追加する1つのことは、--interactiveまたは-pモードが使用されている場合、git addはupdate(-u)フラグが使用されているかのように動作し、新しいファイルを追加しないことです。

3
Yehuda Schwartz

git add .git add -Aはどちらも、新しいバージョンのgitに、すべての新規、変更、および削除されたファイルをステージングします。

違いは、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を実行すると、どこからコマンドを実行しても、確実にこの変更が行われます。

これが違いを解消することを願っています。

2
sbr_amd