連載
» 2020年03月19日 05時00分 公開

Linux基本コマンドTips(385):【 git commit 】コマンド――インデックスの内容をローカルリポジトリに記録/保管する

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はGitについて、インデックスの内容をリポジトリに記録/保管する「git commit」コマンドです。

[西村めぐみ,@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、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

(インデックスの内容をコミットする)


画面1 画面1 インデックスの内容をコミットするところ
画面2 画面2 コミットメッセージの入力画面
画面3 画面3 コミットが完了したところ
画面4 画面4 コミットの内容を確認したところ


メッセージを指定してコミットする

 「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

(メッセージなしでコミットを実行する。エディタの起動を省略できる)


画面5 画面5 メッセージを指定してコミットしたところ


「git add」を省略する

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。