Git
日本語 ▾ Topics ▾ Latest version ▾ git-add last updated in 2.34.1

NAME

git-add - Add file contents to the index

概要

git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
	  [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--sparse]
	  [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--renormalize]
	  [--chmod=(+|-)x] [--pathspec-from-file=<file> [--pathspec-file-nul]]
	  [--] [<pathspec>…​]

説明

このコマンドは、作業ツリーで見つかった現在のコンテンツを使用してインデックスを更新し、次のコミットのためにステージングされたコンテンツを準備します。通常、既存パスの現在のコンテンツ全体を追加しますが、一部のオプションでは、作業ツリーファイルに加えられた変更の一部のみを適用してコンテンツを追加したり、既に作業ツリーに存在しないパスを削除したりすることもできます。

このインデックスで作業ツリーのコンテンツのスナップショットを保持し、次のコミット際に取得されるコンテンツはこのスナップショットです。したがって、少しでも作業ツリーに変更を加えた後はcommitコマンドを実行する前に、 `add`コマンドを使用し、新しいファイルまたは変更されたファイルをインデックスに追加する必要があります。

このコマンドはコミットする前に複数回実行することができます。指定されたファイルのコンテンツのみがaddコマンドで追加されます。次のコミットに後続の変更を含める場合は、 `git add`を再度、実行して、新しいコンテンツをインデックスに追加する必要があります。

`git status`コマンドを使用し、次のコミットのためにステージングされる、変更されているファイルの概要の取得を行うことができます。

git add コマンドはデフォルトでは無視されるファイルを追加しません。無視されるファイルがコマンドラインで明示的に指定された場合、 git add は無視されるファイルのリストで失敗します。Gitによって実行されたディレクトリ再帰またはファイル名グロブ処理(シェルの前にグロブを引用)によって見つかった無視されるファイルは黙って無視されます。git add コマンドを使用すると、 -f(force)オプションを使用することで無視されるファイルを追加することができます。

コミットにコンテンツを追加する別の方法については、linkgit:git-commit [1]を参照してください。

オプション

<pathspec>…​

コンテンツを追加するファイルです。 ファイルグローブ (例: *.c) を指定すると、マッチするすべてのファイルを追加することができます。 また、先頭にディレクトリ名 (例: dirdir/file1dir/file2 を追加します) を指定すると、ディレクトリ全体の現在の状態に合わせてインデックスを更新することができます (例: dir を指定すると、作業ツリーで変更されたファイル dir/file1 や作業ツリーに追加されたファイル dir/file2 だけでなく、作業ツリーから削除されたファイル dir/file3 も記録されます)。古いバージョンの Git では、削除されたファイルは無視されていたことに注意しましょう。修正されたファイルや新しいファイルを追加したいが、削除されたファイルは無視したいという場合には、--no-all オプションを使用してください。

<pathspec>構文の詳細については、gitglossary[7]の’pathspec’エントリを参照してください。

-n
--dry-run

実際にファイルを追加するのではなく、単にファイルが存在するかどうか、あるいは無視されるかどうかを表示します。

-v
--verbose

詳細が表示されます。

-f
--force

それ以外の場合は無視されたファイルの追加を可能にします。

--sparse

sparse-checkout コーンの外にあるインデックスエントリの更新を可能にしました。 通常、git add は、パスが sparse-checkout コーンに収まらないインデックスエントリの更新を拒否します。なぜなら、それらのファイルは警告なしに作業ツリーから削除される可能性があるからです。詳細は git-sparse-checkout[1] を参照してください。

-i
--interactive

作業ツリーで変更されたコンテンツをインデックスに対話形式で追加します。オプションのパス引数を与えることで,作業ツリーのサブセットに操作を限定することができます。詳細は 「インタラクティブモード」を参照してください。

-p
--patch

インデックスとワークツリーの間にあるパッチの塊をインタラクティブに選択し、インデックスに追加します。これにより、ユーザーは修正されたコンテンツをインデックスに追加する前に、差分を確認することができます。

これは効果的に add --interactive を実行しますが、最初のコマンドメニューをバイパスして、patch サブコマンドに直接ジャンプします。 詳しくは「インターアクティブモード」をご覧ください。

-e
--edit

エディターで差分とインデックスを開き、ユーザーが編集できるようにします。エディターを閉じた後、ハンクヘッダーを調整し、パッチをインデックスに適用します。

このオプションの目的は、適用するパッチの行を選んだり、ステージングする行の内容を変更したりすることです。この方法は、インタラクティブなハンクセレクターを使用するよりも早く、柔軟性があります。 しかしながら、混乱が起こりやすく、インデックスに適用できないパッチが作成されることもあります。下記の「パッチの編集」を参照してください。

-u
--update

<pathspec> に一致するエントリがすでにある場合にのみ、インデックスを更新します。 これは、作業ツリーに合わせてインデックス・エントリを削除したり変更したりしますが、新しいファイルは追加しません。

u`オプションを使ったときに<pathspec>が与えられていない場合、作業ツリー全体にあるすべての追跡ファイルが更新されます(古いバージョンのGitでは、更新の対象をカレントディレクトリとそのサブディレクトリに限定していました)。

-A
--all
--no-ignore-removal

作業ツリーに<pathspec>に一致するファイルがある場合だけでなく、すでにインデックスにエントリがある場合にも、インデックスを更新します。これは、作業ツリーに合わせてインデックス・エントリを追加、修正、削除します。

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

--no-all
--ignore-removal

インデックスに知られていない新しいファイルと作業ツリーで変更されたファイルを追加してインデックスを更新しますが、作業ツリーから削除されたファイルは無視します。 このオプションは、<pathspec>が使用されていない場合は、このオプションは何もしません。

このオプションは主に、古いバージョンのGitに慣れているユーザーのためのものです。"git add <pathspec>…​ "は "git add --no-all <pathspec>…​ "と同義語で、つまり削除されたファイルを無視します。

-N
--intent-to-add

パスが後で追加されるという事実だけを記録します。パスのエントリは、コンテンツのないインデックスに配置されます。これは特にそのようなファイルの未ステージングコンテンツを git diff で表示し、git commit -a でコミットしたりする際に便利です。

--refresh

ファイルを追加せずに、インデックスのstat()情報を更新するだけです。

--ignore-errors

インデックス作成時にエラーが発生して追加できなかったファイルがあっても、操作を中断せずに他のファイルの追加を続けます。このコマンドは、ゼロ以外のステータスで終了します。 構成変数 add.ignoreErrors を true に設定すると、この動作がデフォルトになります。

--ignore-missing

このオプションは --dry-run と一緒にのみ使用することができます。このオプションを使うと、指定されたファイルがワークツリーに既に存在しているかどうかに関わらず、無視されるかどうかをチェックすることができます。

--no-warn-embedded-repo

デフォルトでは、git add は、.gitmodules にエントリを作成するので git submodule add を使用せずに埋め込みリポジトリをインデックスに追加すると、警告を出します。このオプションを指定すると、この警告が表示されなくなります (例: サブモジュールに対する操作を手動で行っている場合)。

--renormalize

追跡されたすべてのファイルに "clean "プロセスを新たに適用して、強制的にインデックスに再追加します。 これは core.autocrlf の設定や text 属性を変更した後に、間違った CRLF/LF の改行コードで追加されたファイルを修正するのに便利です。 このオプションは -u を意味します。

--chmod=(+|-)x

追加されたファイルの実行可能ビットを上書きします。 実行可能ビットはインデックスでのみ変更され、ディスク上のファイルは変更されません。

--pathspec-from-file=<file>

Pathspecはコマンドラインの引数の代わりに <file> で渡されます。<file>` が正確に - であれば、標準入力が使用されます。Pathspecの要素はLFまたはCR/LFで区切られます。Pathspecの要素は、設定変数 core.quotePath (git-config[1]参照) で説明されているように、引用することができます。また、--pathspec-file-nul`やグローバルな--literal-pathspecs`も参照してください。

--pathspec-file-nul

`--pathspec-from-file`でのみ意味を持ちます。Pathspecの要素はNUL文字で区切られ、他のすべての文字は文字通りに解釈されます(改行や引用符を含む)。

--

このオプションは、コマンドラインオプションとファイルのリストを分離するために使用できます(ファイル名がコマンドラインオプションと間違えられる可能性がある場合に便利です)。

  • Documentation ディレクトリとそのサブディレクトリにあるすべての`*.txt`ファイルの内容を追加します。

    $ git add Documentation/\*.txt

    この例では、アスタリスク * がシェルから引用されていることに注意してください。これにより、コマンドは Documentation/ ディレクトリのサブディレクトリにあるファイルを含めることができます。

  • すべてのgit-*.shスクリプトからコンテンツを追加することを検討します。

    $ git add git-*.sh

    この例では、シェルにアスタリスクを展開させているので(つまり、ファイルを明示的にリストアップしている)、subdir/git-foo.sh は考慮されません。

インタラクティブモード

インタラクティブモードに入ると、「status」サブコマンドの出力が表示され、その後、対話型コマンドループに入ります。

コマンドループでは、使用可能なサブコマンドのリストが表示され、「What now>」というプロンプトが表示されます。 一般的に、プロンプトが単一の「>」で終わっている場合、与えられた選択肢の中から1つだけ選んで、次のようにreturnと入力します。

    *** Commands ***
      1: status       2: update       3: revert       4: add untracked
      5: patch        6: diff         7: quit         8: help
    What now> 1

選択肢が一意であれば、上記の`s`や`sta`、`status`と言うこともできます。

メインのコマンドループには6つのサブコマンド(+helpとquit)があります。

status

これは、それぞれのパスについて、HEADとインデックスの間の変化(つまり、`git commit`と言えばコミットされるもの)と、インデックスと作業ツリーファイルの間の変化(つまり、`git commit`の前に`git add`を使ってさらにステージングすることができるもの)を示しています。 出力例は以下のようになります。

              staged     unstaged path
     1:       binary      nothing foo.png
     2:     +403/-35        +1/-1 git-add--interactive.perl

これを見ると、foo.png には HEAD との違いがあり (ただしバイナリなので行数は表示されません)、索引付きコピーと作業用ツリーのバージョンには違いがありません (作業用ツリーのバージョンにも違いがあれば、「何もない」ではなく「バイナリ」と表示されたことでしょう)。 もうひとつのファイル git-add--interactive.perl は、インデックスにあるものをコミットすると 403 行が追加され 35 行が削除されますが、作業ツリーのファイルにはさらに修正が加えられています (追加が 1 つ、削除が 1 つ)。

update

これにより、ステータス情報が表示され、「Update>>」というプロンプトが表示されます。 プロンプトが二重の「>>」で終わっている場合は、複数の選択が可能で、空白やカンマで連結することができます。 また、範囲を指定することもできます。 例:「2-5 7,9」で2,3,4,5,7,9をリストから選択します。 範囲内の2番目の数字が省略された場合、残りのすべてのパッチが選択されます。 例:"7-"で7,8,9をリストから選びます。 すべてを選択するには「*」を指定します。

選んだものは、以下のように「*」で強調されます。

           staged     unstaged path
  1:       binary      nothing foo.png
* 2:     +403/-35        +1/-1 git-add--interactive.perl

選択を解除するには、次のように入力の前に - を付けます。

Update>> -2

選択を行った後、空の行で応答して、インデックス内の選択されたパスの作業ツリーファイルの内容をステージングします。

revert

これは「update」と非常によく似たUIで、選択されたパスのステージングされた情報が、HEADバージョンのものに戻されます。 新しいパスを元に戻すと、そのパスはトラックされなくなります。

add untracked

これは「update」や「revert」とよく似たUIで、追跡されていないパスをインデックスに追加することができます。

patch

これにより、「ステータス」のような選択の中から一つのパスを選ぶことができます。 パスを選択した後、インデックスと作業ツリーファイルの差分を表示し、各ハンクの変更をステージングするかどうかを尋ねます。 以下のオプションを選択し、return と入力してください。

y - このハンクをステージングする
n - このハンクをステージングしない
q - quit; このハンクや残りのハンクをステージングしません。
a - このハンクとファイル内のすべての後続ハンクをステージングします。
d - このハンクをステージングせず、ファイル内の後続のハンクもステージングしません。
g - 移動するハンクを選択します。
/ - 指定された正規表現に一致するハンクを検索します。
j - このハンクを未決定にして、次の未決定ハンクを参照します。
J - このハンクを未決定にして、次のハンクを参照します。
k - このハンクを未決定にして、前の未決定のハンクを見る
K - このハンクを未決定のままにして、前のハンクを参照します。
s - 現在のハンクを小さなハンクに分割します。
e - 現在のハンクを手動で編集します。
?- ヘルプを表示

すべてのハンクの運命を決定した後、選択されたハンクがあれば、選択されたハンクでインデックスが更新されます。

構成変数 interactive.singleKeytrue に設定すれば、ここで return を入力する必要はありません。

diff

これにより、コミットされる内容を確認することができます(つまり、HEADとindexの間)。

パッチの編集

git add -e` を実行するか、インタラクティブな hunk セレクタから e を選択すると、エディタでパッチが開かれ、エディタが終了すると、結果がインデックスに適用されます。パッチには自由に変更を加えることができますが、変更によっては混乱を招く結果になったり、適用できないパッチになってしまうこともあるので注意が必要です。 もし、この操作を完全に中止したい(つまり、インデックスに何も新しいものを入れないようにしたい)場合には、単純にパッチのすべての行を削除してください。以下のリストは、パッチの中でよく見られるものと、それに対してどのような編集操作が意味を持つかを説明しています。

追加コンテンツ

追加されたコンテンツは、「+」で始まる行で表されます。追加された行を削除することで、ステージングを防ぐことができます。

削除されたコンテンツ

削除されたコンテンツは、「-」で始まる行で表されます。この"-"を" "(スペース)に変換することで、削除されたことを演出することができます。

変更されたコンテンツ

修正されたコンテンツは、"-"行(古いコンテンツの削除)と"+"行(置き換えコンテンツの追加)で表されます。"-"行を" "に変換し、"+"行を削除することで、修正のステージングを防ぐことができます。ペアの半分だけを修正すると、インデックスに紛らわしい変化が生じやすいので注意が必要です。

また、より複雑な操作を行うこともできます。しかし、パッチはインデックスにのみ適用され、作業ツリーには適用されないため、作業ツリーではインデックスの変更を「元に戻した」ように見えることに注意してください。 例えば、HEADにも作業ツリーにもない新しい行をインデックスに導入すると、コミットのために新しい行がステージされますが、作業ツリーではその行は元に戻されたように見えます。

これらの構造の使用は避けるか、または細心の注意を払って行ってください。

手つかずのコンテンツの削除

インデックスと作業ツリーの間に違いのないコンテンツは、「 」(スペース)で始まるコンテクストラインに表示することができます。 スペースを"-"に変換することで、コンテクストラインを削除するように設定できます。その結果として生成された作業ツリー ファイルは、コンテンツを再追加するように表示されます。

既存のコンテンツの変更

また、コンテクスト行を削除するためにステージングし(" "を"-"に変換)、新しい内容の"+"行を追加することで、コンテクスト行を修正することができます。 同様に、既存の追加や修正のために「+」行を修正することもできます。いずれの場合も、作業ツリーでは新しい修正が元に戻されて表示されます。

新規コンテンツ

また、パッチ内に存在しないコンテンツを新たに追加することもできます。追加された内容は、作業ツリーでは元に戻されて表示されます。

また、パッチの適用が不可能になるため、完全に避けるべき操作もいくつかあります。

  • 文脈(" ")や削除("-")の追加

  • コンテキストまたは行の削除

  • コンテキストの内容を変更もしくは行の削除

GIT

Part of the git[1] suite

scroll-to-top