git-add

コマンド名

「git-add」:ファイルのコンテンツをインデックスに追加

概要


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

説明

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

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

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

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

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

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

オプション

<pathspec>…

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

<pathspec>シンタックスの詳細についてはgitglossary[7]のパススペックエントリを参照してください。

-n
--dry-run

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

-v
--verbose

長々とする(メッセージを増やす)

-f
--force

ファイルの追加を許可し、そうでなければ無視します。

-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 add <pathspec>…」が「gitadd–no-all <pathspec>…」と同じものを示していた古いバージョンのGitに慣れているユーザーをサポートするためのものです。

-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 submodule addを使用して、.gitmodulesにエントリを作成せずに、組み込みリポジトリをインデックスに追加すると、git addは警告を表示します。このオプションはその警告を表示させないようにします(例えば、サブモジュールを手動でオペレーション実行している場合)。

--renormalize

追跡したすべてのファイルに「クリーン」プロセスを新たに適用し、それらをインデックスに強制的に再度追加します。これはcore.autocrlf設定またはtext属性を変更した後、間違ったCRLF / LFラインで追加されたファイルを修正するために役立ちます。このオプションは-uを意味します。

--chmod=(+|-)x

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

--pathspec-from-file=<file>

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

--pathspec-file-nul

--pathspec-from-fileでのみ機能します。パススペック要素はNUL文字で区切られ、他のすべての文字はそのまま解釈されます(改行と引用符を含む)。

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

  • Documentationディレクトリとそのサブディレクトリの下にあるすべての*.txtファイルからコンテンツを追加します。
    $ git add Documentation/\*.txt

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

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

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

インタラクティブモード

コマンドがインタラクティブモードに入ると、ステータスサブコマンドの出力が表示され、インタラクティブコマンドループに入ります。

コマンドループは使用可能なサブコマンドのリストを表示し、「Whatnow>」というプロンプトを表示します。 一般的にプロンプトが単一の「>」で終了する場合、次のように指定された選択肢の内1つのみを選択し、リターンを入力します。

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

You also could say s or sta or status above as long as the choice is unique.
The main command loop has 6 subcommands (plus help and quit).

選択が他に存在しない場合、上記のss、sta 、または statusを選択できます。

メインコマンドループには6つのサブコマンドがあります(それに加えて、「help」と「quit」)。

status

これは各パスのヘッドとインデックスの間の変更(つまり、git commitの場合にコミットされるもの)、およびインデックスとワークツリーファイルの間の変更(つまり、git addを使用してgit commitの前にさらにステージングできるもの)を示しています。 サンプル出力は次のようになります。

              staged     unstaged path
     1:       binary      nothing foo.png
     2:     +403/-3

foo.pngにはヘッドとの違いがあり(ただし、バイナリであるためラインカウントを表示できません)、インデックス付きのコピーとワークツリーのバージョンに違いはありません(ワークツリーのバージョンも異なる場合、何もない代わりにバイナリが表示されます)。 もう1つのファイルであるgit-add–interactive.perlにはインデックスにあるものをコミットすると403のラインが追加され、35ラインが削除されますが、ワークツリーファイルにはさらに変更が加えられます(1回の追加および1回の削除)。

update

これによりステータス情報が表示され、「更新>>」プロンプトが発行されます。プロンプトが「>>」で終わる場合、空白またはコンマで連結して複数の選択を行うことができます。また範囲も選択することができます。例えば、リストから2、3、4、5、7、9を選択して、、「2~5および7、9」とできます。範囲内の2番目の数値を省略すると、残りのすべてのパッチが取得されます。例えば、リストから7、8、9を選択し、「7-」とできます。「*」として、すべてを選択することもできます。
選択したものは次のように「*」でハイライトされます。

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

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

Update>> -2

選択をした後、空のラインで応答し、インデックス内の選択したパスのワークツリーファイルのコンテンツをステージングします。

revert

これは更新するUIが非常に似ており、選択したパスのステージングされた情報がヘッドDバージョンの情報に戻ります。新しいパスを元に戻すと追跡されなくなります。

add untracked

これは更新および元に戻すためのUIと非常によく似ており、追跡されていないパスをインデックスに追加できます。

patch

これにより、選択などのステータスから1つのパスを選択できます。パスを選択すると、インデックスとワークツリーファイルの差分が表示され、各ハンクの変更をステージングするかどうかが尋ねられます。次のオプションのいずれかを選択して、リターンと入力します。

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

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

設定変数interactive.singleKeyをtrueに設定することにより、ここでリターンを入力する必要をなくすことができます。

diff

これによりコミットされるもの(つまり、ヘッドとインデックスの間)を確認できます。

パッチの編集

git add -eを呼び出すか、インタラクティブハンクセレクターからeを選択すると、エディターでパッチが開きます。エディターが終了すると、結果がインデックスに適用されます。パッチに任意の変更を加えることは自由ですが、一部の変更は混乱を招く結果をもたらす可能性があること、または適用できないパッチとなる可能性があることに注意してください。オペレーションを完全に終了する場合(つまり、インデックスに新しいものをステージングしない場合)、パッチのすべてのラインを削除するだけです。以下のリストはパッチに見られる一般的なものと、それらに対する編集オペレーションについて説明しています。

added content

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

removed content

削除されたコンテンツは「-」で始まるラインで表示されます。「-」を「」(スペース)に変換することで、削除のステージングを防ぐことができます。

modified content

変更されたコンテンツは「-」ライン(古いコンテンツを削除)とそれに続く「+」ライン(置換コンテンツを追加)で表示されます。「-」ラインを「」に変換し、「+」ラインを削除することで、変更のステージングを防ぐことができます。ペアの半分だけを変更すると、インデックスに紛らわしい変更が加えられる可能性があることに注意してください。

実行可能なより複雑なオペレーションもあります。ただし、パッチはワークツリーではなくインデックスにのみ適用されるため、ワークツリーはインデックスの変更を「元に戻す」ように見えることに注意してください。例えば、ヘッドにもワークツリーにも存在しないインデックスに新しいラインを導入すると、コミットのために新しいラインがステージングされますが、そのラインはワークツリーで元に戻されているように見えます。

これらの構成を使用しないようにするか、もしくは細心の注意を払って使用してください。

removing untouched content

インデックスとワークツリーの間で異なっていないコンテンツは「 “”」(スペース)で始まるコンテキストラインに表示される場合があります。スペースを「-」に変換することで、削除するコンテキストラインをステージングできます。結果のワークツリーファイルはコンテンツを再追加するように表示されます。

modifying existing content

削除するためにステージングし(「」を「-」に変換することにより)、新しいコンテンツに「+」ラインを追加することにより、コンテキストラインを変更することもできます。同様に既存の追加または変更のために「+」ラインを変更できます。いずれの場合においても新しい変更はワークツリーに戻され、表示されます。

new content

パッチに存在しない新しいコンテンツを追加することもできます。それぞれが「+」で始まる新しいラインを追加するだけです。追加はワークツリーに戻されて表示されます。

パッチが適用できなくなるため、完全に回避する必要のあるオペレーションもいくつかあります。

  • コンテキスト「””」または削除「 “-“」ラインの追加
  • コンテキストまたは削除ラインの削除
  • コンテキストまたは削除ラインの内容を変更

こちらもご参考ください。

git-status[1] git-rm[1] git-reset[1] git-mv[1] git-commit[1] git-update-index[1]

Git

git[1]パッケージソフトの一部

git公式ドキュメント

add