本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はGitについて、ワークツリーで変更した内容をインデックスに追加する「git add」コマンドです。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はGitについて、ワークツリーで変更した内容をインデックスに追加する「git add」コマンドです。
「git」は「Git」という分散型バージョン管理システム用のコマンドです。Gitは元々Linuxカーネルのソースコードを管理するために作られた「バージョン管理システム」で、現在は多くのソフトウェアのソースコードやWebサイトのコード、ドキュメント管理などに用いられています。
ソースコードを管理する際、最新版だけを保存するやり方はうまくいきません。開発中のさまざまなタイミングで状態を管理し、必要に応じて比較、参照したり、元に戻したりできるようにする仕組みが「バージョン管理システム」です。
Gitでは、テスト版など複数に枝分かれした状態も管理できます。複数のメンバーによる開発を前提としており、開発中の各時点におけるコメントや、コメントへの返信なども管理できるようになっています。
gitコマンドはほとんどの場合、「サブコマンド」と組み合わせて利用します。今回紹介する「git add」はワークツリーで変更した内容をインデックスに追加するコマンドです(本連載ではgitとサブコマンドの組み合わせをコマンドとして紹介します)。
gitコマンドが扱う「リポジトリ(repository)」とは、ソースコードや変更履歴、コメントなどを一括して保管する場所です。リポジトリには、自分のPC上に作る「ローカルリポジトリ」と、「GitHub」などのWebサービス上に作る「リモートリポジトリ」があり、両者を連携させることで複数の開発者による開発を1本にまとめることができます。
既存のリポジトリ(リモートリポジトリ)にあるソースコードなどを入手したい場合は、まず、「git clone」(連載第381回)でリポジトリを自分の環境に複製します(※1)。リモートリポジトリの内容がバージョンアップされたら「git pull」(連載第382回)コマンドで最新版を取得します。開発に参加するのではなく、単に最新版を取得したいという場合は、「git clone」と「git pull」を利用すればよいでしょう。
※1 特定のファイルだけが欲しい場合、例えばGitHub(github.com)にあるリポジトリであれば「Raw」というボタンで表示されるURLを使い、「wget」コマンドなどを使ってダウンロードできる。この他、プロジェクト全体をダウンロードするためのリンクも用意されている([Clone or download]ボタン→「Download ZIP」)。
保管場所であるリポジトリに対し、ファイルの編集などを行う場所を「ワークツリー」あるいは「ワーキングエリア」などと呼びます。「git clone」や「git pull」で取得した最新版のファイルはワークツリーに配置されます。つまり「作業ディレクトリ」です。
ワークツリー(作業ディレクトリ)で編集した結果をリポジトリに反映する操作を「コミット」と呼びます。「git add」コマンドでコミットしたいファイルを「インデックス」あるいは「ステージングエリア」と呼ばれる領域に追加します。インデックスにはファイルの変更箇所などが記録されます。
インデックスの内容は「git commit」コマンドでローカルリポジトリにコミットされ、「git push」コマンドでローカルリポジトリの内容をリモートリポジトリに反映します。従って、「git add」や「git commit」などを行わなければ、自分の環境で編集した内容がリポジトリに影響を与えることはありません。自由に編集し、テストできます。なお、ワークツリーのファイルを過去の任意のコミット状態に戻すことも可能です。
Gitには、この他、開発中のプログラムやドキュメントを、「テスト版」「○○版」……のように枝分かれさせたり、それらを合流させたりする機能もあります。枝分かれしたそれぞれのバージョンを「ブランチ」(branch)と呼び、ブランチを合流させることを「マージ」(merge)と呼びます。
git [オプション] サブコマンド [サブコマンドごとのオプションや引数]
git add [オプション] [ファイル名またはディレクトリ名……]
※ [ ]は省略可能な引数を示しています。
短いオプション | 長いオプション | 意味 |
---|---|---|
-C パス | カレントディレクトリではなく指定したディレクトリで実行したものとする | |
--bare | リポジトリを「bareリポジトリ」(ワーキングディレクトリが存在しない、管理だけを目的としたリポジトリ)として扱う | |
-c 設定=値 | 設定値を指定する(設定は「git config」で確認可能) | |
-p | --paginate | 全ての出力を「less」コマンドまたは環境変数PAGERで指定されたコマンドで表示する |
-P | --no-pager | 「less」コマンドで表示しない(「-p」の指定を打ち消す) |
--exec-path=パス | gitの実行ファイルのパスを指定する(「--exec-path」のみの場合、実行ファイルのパスを表示する) | |
--html-path | gitのHTML形式のドキュメントがインストールされたパスを表示する | |
--man-path | gitのmanファイルのパスを表示する | |
--info-path | gitのinfoファイルのパスを表示する | |
コマンド | 実行内容 |
---|---|
clone | リポジトリのクローンを作成する |
init | リポジトリを新規作成する、または既存のリポジトリを初期化する |
remote | リモートリポジトリを関連付けする |
fetch | リモートリポジトリの内容を取得する |
pull | リモートリポジトリの内容を取得し、現在のブランチに取り込む(「fetch」と「merge」を行う) |
push | ローカルリポジトリの変更内容をリモートリポジトリに送信する |
add | ファイルをインデックスに追加する(コミットの対象にする) |
rm | ファイルをインデックスから削除する |
mv | ファイルやディレクトリの名前を変更する |
reset | ファイルをインデックスから削除し、特定のコミットの状態まで戻す |
status | ワークツリーにあるファイルの状態を表示する |
show | ファイルの内容やコミットの差分などを表示する |
diff | コミット同士やコミットと作業ツリーの内容を比較する |
commit | インデックスに追加した変更をリポジトリに記録する |
tag | コミットにタグを付ける、削除する、一覧表示する |
log | コミット時のログを表示する |
grep | リポジトリで管理されているファイルをパターン検索する |
branch | ブランチを作成、削除、一覧表示する |
checkout | 作業ツリーを異なるブランチに切り替える |
merge | 他のブランチやコミットの内容を現在のブランチに取り込む |
rebase | コミットを再適用する(ブランチの分岐点を変更したり、コミットの順番を入れ替えたりできる) |
config | 現在の設定を取得、変更する |
短いオプション | 長いオプション | 意味 |
---|---|---|
-A | --all、--no-ignore-removal | Gitで管理していないファイルも含めてインデックスに追加する(ワークツリーから削除したファイルは、削除したことを登録する) |
-u | --update | Gitで管理している全てのファイルの変更内容をインデックスに追加する(本文を参照) |
-p | --patch | ファイル単位での追加はなく、個々の変更内容を確認しながらインデックスに追加する |
-e | --edit | 変更内容を編集する |
-f | --force | 「.gitignore」で対象外としているファイルもインデックスに追加する |
-i | --interactive | インタラクティブモードで処理を選択する([q]キーまたは[CTRL]+[C]キーで中断) |
-N | --intent-to-add | 後で追加する予定であることを記録する(正式に追加するまで「git commit」コマンドの対象にはならないが、変更箇所を確認する「git diff」コマンドの対象になる) |
-n | --dry-run | 実行内容を表示するだけで実際には実行しない(本文を参照) |
-v | --verbose | 実行中の内容を表示する |
--ignore-errors | 途中の処理に失敗しても操作を中断しない | |
--renormalize | 正規化をやり直す(cleanプロセスを適用してインデックスに追加し直す。改行コードの自動変換設定を変更した際などに使用する) | |
-- | この指定以降は全て引数(ファイル名やディレクトリ名)として扱う | |
「git add ファイル名」で、指定したファイルをインデックス(ステージングエリア)に追加します。「git add .」ではカレントディレクトリにある全てのファイルが追加の対象となります。
インデックスにはファイルの変更内容が記録されて、「git commit」コマンドの対象となります。
変更内容をインデックスに追加することを「ステージング」と表現することがあります。既にステージングの対象になっている内容を「git diff --cached」で確認できます。「git diff」コマンドについてはこの後の連載で取り上げる予定です。
なお、「git add」は、ワークツリー(作業ディレクトリ)の中で実行する他に、「git -C 作業ディレクトリ名 add ファイル名」のように、「-C」でワークツリーの場所を指定して実行できます。
どのファイルが対象になるかを確認したい場合は、「-n」オプション(--dry-runオプション)を付けて実行するとよいでしょう。実際の処理は行わず、処理内容だけを表示できます。
git add ファイル名
(指定したファイルの変更内容をインデックスに追加し、「git commit」の対象にする)
git add *.html images/*.png
(「*.html」と「images/*.png」をインデックスに追加する)
git add .
(カレントディレクトリの全てのファイルをインデックスに追加する)
git add -n .
(「git add .」でどのファイルが対象となるかを表示する)
画面1では、リポジトリを作成後、カレントディレクトリ内の全ファイルを対象としてインデックスに追加した場合の状況を確認しています。その後、特定のファイルのみを選んで実際に追加しました。
常に「git add」の対象から外したいファイルがある場合は、ワークツリー(作業ディレクトリ)の「.gitignore」ファイルに対象外としたいファイル名やディレクトリ名を書いておきます(画面2)。「*.bak」のようなパターンを書くこともできます。
「git add -u」で、現在Gitで管理している全てのファイルを対象にして、インデックスに追加します(画面3)。
git add -u
(現在Gitで管理している全てのファイルを対象に、インデックスに追加して、「git commit」の対象にする)
変更内容をファイル単位でまとめて追加するのではなく、変更箇所や変更内容を確認しながらインデックスに追加したい場合は「-p」オプションを使用します。一つ一つの変更を「hunk」と呼び、diffのunified形式(diff -u)で出力します。
「git add -p」を実行すると、変更のまとまりごとに、「Stage this hunk [y,n,q,a,d,s,e,?]?」のような確認メッセージを表示します。各コマンドの意味は次の通りです。
コマンド | 意味 |
---|---|
y | このhunkをインデックスに追加する |
n | このhunkはインデックスに追加しない |
q | 処理を中断する |
a | このhunkと以降のhunkを全てインデックスに追加する |
d | このhunkと以降のhunkを全てスキップする |
s | このhunkをさらに小さいまとまりに分割する(可能な場合のみ) |
e | このhunkを修正する(エディタがオープンする。+行、つまり新しい内容の行を修正することで修正内容を変更できる) |
? | ヘルプを表示する |
git add -p 対象
(変更内容を確認しながらインデックスに追加する)
画面4では、確認メッセージに対して[e]キーを押して編集しています。viの起動後、該当するhunkを表示します(画面5)。「+」から始まっている行を修正してください。
西村 めぐみ(にしむら めぐみ)
元々はDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの"PCヘルパー"やピンポイント研修なども行っている。
Copyright © ITmedia, Inc. All Rights Reserved.