git add *(アスタリスク)対git add。(限目)


129

私はgitを使い始めたばかりで、gitにファイルを追加することについて質問があります。私はとの違いについて、複数のstackoverflowの質問を発見したgit add .git add -agit add --allgit add -A、などしかし、私は何かを説明場所見つけることができませんしてきたgit add *んです。私もgit add manページを見てきましたが、役に立ちませんでした。私は代わりにそれを使ってきました、git add .そして私の同僚はなぜ私に尋ねました。答えがありませんでした。私はいつもいつも使っていgit add *ます。

あるgit add .git add *同じ?1つは現在のディレクトリからのみ変更されたファイルを追加し、もう1つは現在のディレクトリとサブディレクトリから(再帰的に)ファイルを追加しますか?

他のスタックの質問の1つに、git add -A git add .との違いを示す優れたグラフがありますgit add -uが、はありませんgit add *

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

注:アスタリスクをワイルドカードとして使用することの意味を理解しています(特定の拡張子を持つすべてのファイルを追加します)。たとえば、git add *.html持っているすべてのファイル追加します.html(ただし、無視拡張子を.css.jsなど)。

助けてくれてありがとう!


1
そのチャートはどこから来たのですか?git add .もう一度試したところ、削除されたファイルが問題なくステージングされましたX
デビッド

@Davidその画像はこの回答からのものであり、古いバージョンのgitに適用されます。
ジェリー

4
画像が古くなっています!Git 2.xは異なります:i.stack.imgur.com/KwOLu.jpg
Hannes Schneidermayer

回答:


131

add *名前がドットで始まるファイルを除いて、現在のディレクトリにあるすべてのファイルを追加することを意味します。これはシェルの機能であり、Gitはファイルのリストのみを受け取ります。

add . シェルでは特別な意味がないため、Gitはディレクトリ全体を再帰的に追加します。これはほとんど同じですが、名前がドットで始まるファイルを含みます。


6
そうgit add ..gitignoreと、何ドットで始まるを含む、すべてのファイル、フォルダ、およびサブフォルダは、しばらくは、追加git add *ドットで始まるものを除き、すべてのファイル、フォルダ、およびサブフォルダを追加しますか?それは正確ですか?
タイラーヤングブラッド2014

9
それは確かに正しいです。また、git add *サブディレクトリにある場合、ドットで始まるファイルを追加します。
Denis

4
git add .また、.gitignoreを尊重しgit add *ますが、ドットファイル以外のファイルがgitignoredの場合はエラーをスローします。使用するgit add .よりはるかに良いgit add *
rosuav

2
注目に値する:DOS / WindowsでCMD.EXEからGitを呼び出す場合、それを展開するのはシェルではなくGit*です。この場合、Gitはドットファイルを見つけます。
torek

2
@ Thor84no:*シェルから保護するためにを引用すると、LinuxシステムでもGitはドットファイルを検出します。それは隠されたビットの問題ではなく、Gitのコンパイル済みルールが異なるだけです。
トレック

30

*はgitの一部ではありません-これはシェルによって解釈されるワイルドカードです。*現在のディレクトリ内のすべてのファイルに展開し、それからgitに渡されaddます。 .現在のディレクトリ自体であり、git addこれを実行すると、そのディレクトリとその下のすべてのファイルが追加されます。


1
それで、アスタリスクを使用する理由はすべてありますか?ピリオドの代わりに使用する利点はありますか?またはその逆?チュートリアルで見たと思います。それ以外の方法で使用することは知らなかったでしょう。私はそれほどコマンドラインの人ではありません(間違いなく推測しているように)。
タイラーヤングブラッド2014

5
*隠しファイル(つまり、名前がで始まるファイル)を回避します.。とにかく、特定のファイルを追加しないのであれば、私はgit add -u(またはgit add -A、新しいファイルを作成している場合)を使用します。
Mureinik 2014

3
あなたが両方とも私の質問に答えたので、私は誰に信用を与えるべきかを決めるのに苦労しました。担当者があなたよりも少ないため、以下のDenisを選択しました。だから私は彼に緑の小切手を与えることはそれがあなたに利益をもたらすよりも彼に利益をもたらすと考えました。私はそれが理にかなっていると思いますか?しかし、私は両方の説明に本当に感謝しています。ありがとう!
タイラーヤングブラッド

7

. シェルでドットを使用することは、通常「現在のディレクトリ」を意味します。

*シェルでアスタリスクを使用すると、呼び出される機能file-globbingが使用されます。たとえばbashの場合、関数glob()はそれを実行しています。glob(man 7 glob)のマンページには次のように記載されています。

説明

Long ago, in UNIX V6, there was a program /etc/glob that would expand 
wildcard patterns.  Soon afterward this became a shell built-in.
These days there is also a library routine glob(3) that will perform this 
function for a user program.

ワイルドカード照合

A string is a wildcard pattern  if it contains one of the characters '?', '*' or '['. 

グロビング

Globbing is the operation that expands a wildcard pattern 
into the list of pathnames matching the pattern.

つまり'?''*'またはを含むコマンドライン上のプログラムに引数を渡すと'['、最初にグロビングによってワイルドカードパターンがファイルのリストに展開され、次にこれらのファイルがプログラム自体の引数として渡されます。

間の意味の違い'git add .''git add *'明確で記述されているデニス

git addファイルのリストが追加されることを期待しています。上記の例では、シェルが展開する*か、.それぞれ、結果をgit addのパラメーターとして提供します。今の違いは、git add .gitでは現在のディレクトリに展開されるのに対し、git add *ファイルグロビングがトリガーされ、ドットで始まらないすべてのファイルとディレクトリに展開されるという点です。


5

明確にするために、以下の表に答えを示します。

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

追加のメモ(@ reka18コメントに触発):

注1. git add -Aおよびgit add -u追加のパラメーターなしで実行されるコマンドは、作業ディレクトリー全体の範囲で機能する(ファイルのサブディレクトリーまたはマスクの指示)追加の調整(ディレクトリーの作業サブディレクトリーでコマンドを実行する場合も)になります。

注2..*それぞれのコマンドの経路を明確にディレクトリパス(カレントディレクトリ)とワイルドカードです。たとえば、git add .or git add *コマンドが作業ディレクトリのサブディレクトリで実行された場合、それらのアクションは作業ディレクトリ全体ではなく、このサブディレクトリ内でのみ使用されます。

注記3git add -A及びgit add -uコマンドは、さらにパスを追加またはファイルのためのマスク、例えば、によって精製することができるgit add -A app/controllers、またはgit add -u app\styles\*


2
Git v2.x git add -Agit add .同じですか?
reka18

@ reka18、とても良い質問をありがとう。それが私の答えを完成させるきっかけになりました...質問への答え:作業ディレクトリでそれを呼び出す場合、いいえ、サブディレクトリである場合、はい(git add -A作業ディレクトリ全体に適用され、git add .常に現在のディレクトリに適用されます)。
simhumileco

2
  • git add -A (--all)すべてを追加して、ディスク上のフォルダー内のすべてがステージング領域に表示されるようにします

  • git add . すべてをステージングしますが、ディスクから削除されたファイルは削除しません

  • git add * すべてをステージングしますが、ドットで始まり、ディスクから削除されたファイルは削除しません。

  • git add -u (--update)変更されたファイルのみをステージングし、ディスクから削除されたファイルを削除し、新しいファイルを追加しません

  • git add <file name 1> <file name 2> 特定のファイルのみを追加します

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