【 git commit 】コマンド――インデックスの内容をローカルリポジトリに記録/保管する:Linux基本コマンドTips(385)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はGitについて、インデックスの内容をリポジトリに記録/保管する「git commit」コマンドです。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はGitについて、インデックスの内容をリポジトリに記録/保管する「git commit」コマンドです。
git/git commitコマンドとは?
「git」は「Git」という分散型バージョン管理システム用のコマンドです。Gitは元々Linuxカーネルのソースコードを管理するために作られた「バージョン管理システム」で、現在は多くのソフトウェアやWebサイトのソースコード、ドキュメントの管理などに用いられています。
ソースコードを管理する際、最新版だけを保存するやり方はうまくいきません。開発中のさまざまなタイミングで状態を管理し、必要に応じて比較、参照したり、元に戻したりできるようにする仕組みが「バージョン管理システム」です。
Gitでは、テスト版など複数に枝分かれした状態も管理できます。複数のメンバーによる開発を前提としており、開発中の各時点におけるコメントや、コメントへの返信なども管理できるようになっています。
gitのサブコマンドとGitの仕組み
gitコマンドはほとんどの場合、「サブコマンド」と組み合わせて利用します。今回紹介する「git commit」はインデックスの内容をリポジトリに記録/保管するコマンドです(本連載では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」(連載第384回)コマンドでコミットしたいファイルを「インデックス」あるいは「ステージングエリア」と呼ばれる領域に追加します。インデックスにはファイルの変更箇所などが記録されます。
インデックスの内容は「git commit」コマンドでローカルリポジトリにコミットされ、「git push」コマンドでローカルリポジトリの内容をリモートリポジトリに反映します。従って、「git add」や「git commit」などを行わなければ、自分の環境で編集した内容がリポジトリに影響を与えることはありません。自由に編集し、テストできます。なお、ワークツリーのファイルを過去の任意のコミット状態に戻すことも可能です。
Gitには、この他、開発中のソースコードやドキュメントを、「テスト版」「○○版」……のように枝分かれさせたり、それらを合流させたりする機能もあります。枝分かれしたそれぞれのバージョンを「ブランチ」(branch)と呼び、ブランチを合流させることを「マージ」(merge)と呼びます。
コマンドの書式
git [オプション] サブコマンド [サブコマンドごとのオプションや引数]
git commit [オプション] [ファイル名……]
※ [ ]は省略可能な引数を示しています。
gitの主なオプション
短いオプション | 長いオプション | 意味 |
---|---|---|
-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ファイルのパスを表示する |
gitのサブコマンド
コマンド | 実行内容 |
---|---|
clone | リポジトリのクローンを作成する |
init | リポジトリを新規作成する、または既存のリポジトリを初期化する |
remote | リモートリポジトリを関連付けする |
fetch | リモートリポジトリの内容を取得する |
pull | リモートリポジトリの内容を取得し、現在のブランチに取り込む(「fetch」と「merge」を行う) |
push | ローカルリポジトリの変更内容をリモートリポジトリに送信する |
add | ファイルをインデックスに追加する(コミットの対象にする) |
rm | ファイルをインデックスから削除する |
mv | ファイルやディレクトリの名前を変更する |
reset | ファイルをインデックスから削除し、特定のコミットの状態まで戻す |
status | ワークツリーにあるファイルの状態を表示する |
show | ファイルの内容やコミットの差分などを表示する |
diff | コミット同士やコミットと作業ツリーの内容を比較する |
commit | インデックスに追加した変更をリポジトリに記録する |
tag | コミットにタグを付ける、削除する、一覧表示する |
log | コミット時のログを表示する |
grep | リポジトリで管理されているファイルをパターン検索する |
branch | ブランチを作成、削除、一覧表示する |
checkout | 作業ツリーを異なるブランチに切り替える |
merge | 他のブランチやコミットの内容を現在のブランチに取り込む |
rebase | コミットを再適用する(ブランチの分岐点を変更したり、コミットの順番を入れ替えたりできる) |
config | 現在の設定を取得、変更する |
git commitの主なオプション
短いオプション | 長いオプション | 意味 |
---|---|---|
-a | --all | ワークツリーで変更済みのファイルをコミットする(「git add」コマンドによる操作を省略する、※2) |
--interactive | ファイル単位で選択しながらコミットする | |
--patch | 個々の変更内容を確認しながらコミットする | |
--amend | 直前のコミットをやり直す | |
--allow-empty | 空のコミットを許可する(※3) | |
-m メッセージ | --message=メッセージ | コミットメッセージを指定する |
--allow-empty-message | メッセージを付けないコミットを許可する | |
-C コミット | --reuse-message=コミット | コミットメッセージを指定したコミットから読み出す(※4) |
-t ファイル | --template=ファイル | コミットメッセージ用のテンプレートを指定したファイルから読み出す(※4) |
--author=作者 | 作者(Author)を指定する(デフォルトは「git commit」コマンドを実行したユーザー名) | |
--reset-author | 作者(Author)を置き換える(「-C」や「--amend」と併用する) | |
-s | --signoff | 「Signed-off-by」行をコミットメッセージに追加する(※5) |
--date | コミットした日時(デフォルトは「git commit」コマンドを実行した日時) | |
-n | --dry-run | 実行内容を表示するだけで実際には実行しない |
-v | --verbose | 実行中の内容を表示する |
※2 ただし、初回のみ管理対象を決めるために「git add」コマンド操作が必要。
※3 「-m --allow-empty」でメッセージ入力用のエディタを開かずにコミットできる。
※4 エディタが起動する。
※5 「Signed-off-by: コミットした人の名前とメールアドレス」という行を追加する。
インデックスの内容をコミットする
ワークツリーでソースコードなどファイルの内容を変更した後、まず、「git add」でインデックスに追加します。その後、「git commit」でリポジトリにコミットします。コミット先はローカルリポジトリです。変更内容をリモートリジトリにも反映させたい場合は「git push」を実行する必要があります。
「git commit」をワークツリー(作業ディレクトリ)の中で実行する場合とは異なり、ワークツリーの外で実行する場合は、「git -C 作業ディレクトリ名 commit」のように、「-C」でワークツリーの場所を指定します(※6)。
※6 通常、リポジトリは作業ディレクトリの「.git」ディレクトリに作成されている(連載第383回)。
画面1のように「git commit」を実行すると、コミットとともに記録されるメッセージ(コミットメッセージ)を入力するためにエディタ(vi)が開きます(画面2)。必要なメッセージを入れて保存しましょう(画面3)。なお、メッセージを入力しなかった場合、commit処理が中断します。
コミットした後のワークツリーの状態を確認するには「git status」コマンドを使います(画面4)。「git log」コマンドでコミットの履歴を表示でき、コミットした内容自体を確認するには「git show」コマンドが役立ちます。
「git log」では、コミットを行った人(Author、※7)や日時、コミットの際に自動生成される固有の値(コミットハッシュ)、メッセージを確認できます。表示の際は「less」コマンドを使うため、表示を終了するには[Q]キーを使います。
※7 Authorは「--author=」オプションで変更可能。プロジェクトによっては、「-s(--signoff)」オプションで別途署名を付けるルールとなっている場合もある。
コマンド実行例
git commit
(インデックスの内容をコミットする)
メッセージを指定してコミットする
「git commit -m メッセージ」でコミット時のメッセージを指定できます(画面5)。メッセージに空白を含む場合は「git commit -m "メッセージ"」のように引用符で囲む必要があります。「-m」でメッセージを指定した場合、画面2のようなエディタは起動せず、即座にコミットを実行します。
メッセージを入力せずにコミットしたい場合は、「--allow-empty-message」を指定します。「git commit -m --allow-empty-message」のように指定することで、メッセージの指定とエディタの起動の両方を省略できます(※8)。
※8 メッセージを指定しない場合でも、「git tag "タグ"」で、コミットに対してタグを付けることが可能。
コマンド実行例
git commit -m "メッセージ"
(メッセージを指定してコミットを実行する。エディタの起動を省略できる)
git commit -m --allow-empty-message
(メッセージなしでコミットを実行する。エディタの起動を省略できる)
「git add」を省略する
変更したファイルを直接リポジトリにコミットしたい場合は、「git commit -a」とします(画面6)。この場合、「git add」を省略できます。
コミット対象を指定する必要はなく、管理対象となっているファイルをコミットします(「git add -u」相当)。なお、ファイルを追加した場合は、先に「git add ファイル名」を実行しておく必要があります。
コマンド実行例
git commit -a
(ワークツリーで変更したファイルを直接コミットする。インデックスを経由しない)
git commit -a -m "メッセージ"
(インデックスを経由せず、メッセージを指定してコミットする)
筆者紹介
西村 めぐみ(にしむら めぐみ)
元々はDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの"PCヘルパー"やピンポイント研修なども行っている。
Copyright © ITmedia, Inc. All Rights Reserved.