本記事は『つくって、壊して、直して学ぶ Git&GitHub 入門』(著者:高橋あおい)の「Chapter 3 Gitの基本的な使い方と用語を知ろう」から一部を抜粋したものです。掲載にあたって編集しています。



コミットを知ろう
Gitでは現在作業している場をWorking Tree(ワーキングツリー)/Working Directory(作業ディレクトリ)と呼びます。本書ではわかりやすさのため作業ディレクトリと記載します。
作業ディレクトリとローカルリポジトリの差分をうまく管理するために導入されているのがステージングエリアという仕組みです。ステージングエリアはインデックスとも呼びます。
そもそもローカルリポジトリって何? データベース? などと疑問に思われるかもしれません。ローカルリポジトリの実体は.gitというディレクトリです。作業ディレクトリは.gitディレクトリが置かれているディレクトリ全体を示しますが、後述するコミットを実行することでさらに.gitディレクトリの中に履歴として変更の情報が保存されます。
gitコマンドは作業ディレクトリ全体と.gitディレクトリの履歴の差分を出したり、.gitディレクトリの履歴の中から情報を復元したりします。
「なんか難しそうだけれど、実は.gitディレクトリの中にコミットの履歴やGitの設定情報、ステージングエリアの内容などが全部書かれている!」と思うと少しはイメージが湧いてくるでしょうか。.gitディレクトリの中身は会員特典データ(Gitの中身を見てみよう)で詳しく説明します。

ローカルリポジトリに特定の変更を保存することをコミットと言います。コミットにはそれぞれ識別番号(ID)がつき、それをコミットIDと呼びます。コミットIDは各コミットを識別するためのものであり、たとえば特定のコミットを消したいときや特定のコミットの変更履歴を参照したいときなどに活用するケースが多くあります。次のスクリーンショットでコミットの履歴の例を見てみましょう。

「作業ディレクトリ」の変更履歴を「ローカルリポジトリ(.gitディレクトリ)」に保存するために「コミット」する……これで十分かもしれません。しかし、Gitの大きな工夫の1つとして、コミットを便利にするためにステージングエリアが存在します。ステージングエリアは、コミットする前にどのファイル(行)を保存する予定か表示し、確認するプレビュー機能の役割を果たしています。
ステージングエリアとは

ステージングエリアにファイル(行)を追加することをステージすると言います。また、ステージングエリアをインデックスと呼ぶこともあります。本書ではステージングエリアの表記で統一します。
ステージングエリアを参照することで、「これからコミットする予定のファイル」を確認できます。これが先ほどから書いているプレビュー機能のことです。慣れないうちはステージすることやステージングエリアの存在が難しく感じられるかもしれません。しかしコミットする前にどの変更をコミットする予定かチェックできるのは非常に便利ですし、事故防止の観点でも役立ちます。
なんとなくから一歩前進! Gitの基本的なコマンドを知ろう(git status, add, commit, diff, log, show)
具体的にコマンドと用語を比較して見てみましょう。

あらためてそれぞれのコマンドについて説明します。新たにGitリポジトリを作成しましょう。
cd ..コマンドを実行すると1つ上のディレクトリに移動することができます。また、pwdコマンドを実行するとカレントディレクトリの場所を知ることができます。今後は適宜案内しませんが、新規Gitリポジトリを作成するときには気をつけてください。
mkdir study-3-3
cd study-3-3
git init
$ mkdir study-3-3 cd study-3-3 git init Initialized empty Git repository in /Users/aoi/workspaces/github. study-3-3/.git/ $
作業ディレクトリ内のファイルをステージングエリアに追加する:git add
git addというコマンドは、作業ディレクトリ内の現在の内容を使用してステージングエリアを更新し、次のコミットに向けてステージします。
git addコマンドに限った話ではないですが、ファイル名を指定する際には正確にファイル名を入力しましょう。たとえばhello.txtとHello.txtは区別され、間違えてaddしても何も起きません(存在しないファイルをaddしてもエラーは出ません)。
次のコマンドでカレントディレクトリ以下をすべてステージできます。ただし、気づかないうちに余計なファイルもaddしていることがあるため、コミット前にaddしたファイルを確認すると良いでしょう。どのファイルをステージしたか確認するには、git statusコマンドを使います。
git add .
また、次のように特定のファイルのみステージできます。ファイル名はスペースで区切ることで複数ファイルを同時にステージできます。
git add <ファイル名>
では、あらためてgit addコマンドを使ってみましょう。まずはechoコマンドを使用して新規にファイルを作成します。好きなテキストエディタで名前をつけてファイルを保存するのでも問題ありません。
echo "hello" >> test.txt
$ echo "hello" >> test.txt $
git addコマンドを使用してtest.txtをステージしてみましょう。
git add test.txt
$ git add test.txt $
これでtest.txtをステージできました。ただ、これだけでは本当にステージができているか不安ですよね。このような際にGitリポジトリの状況を参照するgit statusコマンドを利用します。
作業ディレクトリのステータスを表示する:git status
git statusコマンドを実行すると、ステージングエリアにあるファイルと現在のコミットの間に差分があるパス、作業ディレクトリとステージングエリアにあるファイルの間に差分があるパス、およびGitに追跡されていない(かつ.gitignoreファイルによって無視されていない)作業ディレクトリ内のパスを表示します。
早速git statusコマンドを実行してみましょう。
git status
$ git status On branch main No commits yet Changes to be committed: (use "git rm --cached..." to unstage) new file: test.txt $
先ほどgit addを実行したファイルがChanges to be committed(コミットされる変更)として結果に出てきました。これはtest.txtがステージされていることを意味しています。
ほかにもgit statusコマンドではGitリポジトリのさまざまな状況を参照できます。ここではもう少し複雑なgit statusコマンドの実行例を見てみましょう。
$ git status
On branch develop
Your branch is up to date with 'origin/develop'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: test2.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: test.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
$
これらのステータスは次のような状態を示します。

間違えてステージングエリアに含めてしまっているファイルや逆にステージングエリアに含め忘れているファイルの有無にこのコマンドで気づけます。
コミットを実行する:git commit
リポジトリに変更を記録します。コミットを行うためにコミットメッセージを書くことは必須です。かつてメジャーだったバージョン管理システムSVNではコミットメッセージ不要でリポジトリに変更を記録できたため、これもSVNとの大きな違いです。
通常はgit commitを実行することでコミットのコメントを入力するテキスト編集画面が開きます。すでにみなさんに手を動かしてもらったように、-mオプションをつけることでコメントをあらかじめ入力しておくこともできます。
git commit -m "コミットコメントです"
ほかにも筆者がたまに使うコマンドをご紹介します。次のコマンドでは「空のコミット」を許可します。
git commit --allow-empty
次のコマンドで直前のコミットメッセージを修正できます。このコマンドは便利なので試してみましょう。
git commit --amend
ここではファイルをステージしたつづきを行います。たとえば、次のようにコミットメッセージを間違えて書いてしまったとしましょう(commitと書きたかったところをcometと書いてしまった)。次のコマンドを実行してください。
git commit -m "This is a comet message"
つづいて、git commit --amendを実行してコミットメッセージを修正しましょう。コマンドを実行するとテキストエディタが立ち上がるので、次のようにcometをcommitに修正しましょう。
This is a commit message # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Sun Oct 5 22:25:47 2025 +0900 # # On branch main # # Initial commit # # Changes to be committed: # new file: test.txt #
#ではじまるコミットメッセージは無視されるので、そのままにしておいて問題ありません。修正が完了したら編集内容を保存してテキストエディタを閉じましょう。すると次のような実行結果が得られます。
$ git commit --amend [main 3ddb14c] This is a commit message Date: Sun Oct 5 22:25:47 2025 +0900 1 file changed, 1 insertion(+) create mode 100644 test.txt $
git logでコミットメッセージを参照できるので、コミットメッセージが修正できていることを確認しましょう。
$ git log
commit 3ddb14c89537e65e2c6fc90c910adbd98291af6d (HEAD -> main)
Author: Aoi <aoi@example.com>
Date: Sun Oct 5 22:25:47 2025 +0900
This is a commit message
$
コミット間やコミットと作業ディレクトリ間などの差分を表示する:git diff
git diffはさまざまな差分を表示するコマンドです。よく使うので覚えておきましょう。git diffにオプションをつけずに実行すると、作業ディレクトリとステージングエリアとの差分が表示されます。サンプルファイルを使用してコマンドを試してみましょう。まずはファイルを2つ作成して行を追加します。
echo "This is file1." >> file1.txt
echo "This is file2." >> file2.txt
$ echo "This is file1." >> file1.txt echo "This is file2." >> file2.txt $
では、つづいて2つのファイルをgit addしましょう。
git add file1.txt file2.txt
$ git add file1.txt file2.txt $
次はコミットしましょう。
git commit -m "Add file1 and file2"
$ git commit -m "Add file1 and file2" [main (root-commit) 9cba478] Add file1 and file2 2 files changed, 2 insertions(+) create mode 100644 file1.txt create mode 100644 file2.txt $
では、次のコマンドでファイルに行を追加しましょう。
echo "New line in file1." >> file1.txt
echo "New line in file2." >> file2.txt
$ echo "New line in file1." >> file1.txt echo "New line in file2." >> file2.txt $
ではどのような差分が出ているのか見るために、git diffを実行してみましょう。
git diff
$ git diff diff --git a/file1.txt b/file1.txt index bfccc4a..8a585ea 100644 --- a/file1.txt +++ b/file1.txt @@ -1 +1,2 @@ This is file1. +New line in file1. diff --git a/file2.txt b/file2.txt index d2947f4..d64b339 100644 --- a/file2.txt +++ b/file2.txt @@ -1 +1,2 @@ This is file2. +New line in file2. $
それぞれのファイルで追加した行が差分として出ています。つづいてgit diff -- <ファイル名>を実行してみましょう。このコマンドでは指定したファイル名に関してのみ作業ディレクトリとステージングエリアの差分が出力されます。
git diff -- file1.txt
git diff -- file1.txt diff --git a/file1.txt b/file1.txt index bfccc4a..8a585ea 100644 --- a/file1.txt +++ b/file1.txt @@ -1 +1,2 @@ This is file1. +New line in file1. $
ではfile1.txtだけgit addしましょう。
git add file1.txt
$ git add file1.txt $
つづいて、git diff --stagedを実行します。このコマンドはステージングエリアと最新コミットとの差分を表示します。
git diff --staged
$ git diff --staged diff --git a/file1.txt b/file1.txt index bfccc4a..8a585ea 100644 --- a/file1.txt +++ b/file1.txt @@ -1 +1,2 @@ This is file1. +New line in file1. $
file1.txtをaddしたので、file1.txtだけ差分が出ていますね。コミット間の差分も参照できます。まずはコミットしましょう。
git commit -m "Add new line in file1"
$ git commit -m "Add new line in file1" [main c0eb170] Add new line in file1 1 file changed, 1 insertion(+) $
git logでそれぞれのコミットIDをメモします。
git log
$ git log
commit c0eb1705c3ec8520bbd066898d9580c4ffb71a69 (HEAD -> main)
Author: Aoi <aoi@example.com>
Date: Fri Feb 21 08:00:19 2025 +0900
Add new line in file1
commit 9cba478c6ba35605d32dcbe7d16d5f12346c6de3
Author: Aoi <aoi@example.com>
Date: Thu Feb 20 22:35:37 2025 +0900
Add file1 and file2
~~~以下略~~~
git diff <コミットID>で現在の作業ディレクトリとコミットの差分を、git diff <コミットID> <コミットID>で2つのコミットIDの差分を参照できます。まずは現在の作業ディレクトリとコミットの差分を見てみましょう。
git diff <最新コミットのコミットID>
$ git diff c0eb1705c3ec8520bbd066898d9580c4ffb71a69 diff --git a/file2.txt b/file2.txt index d2947f4..d64b339 100644 --- a/file2.txt +++ b/file2.txt @@ -1 +1,2 @@ This is file2. +New line in file2. $
現在の作業ディレクトリはfile1.txtの変更をコミットして、file2.txtに新規行を追加した状態です。そのため、file1.txtの変更コミットとの差分としてfile2.txtの行追加が出力されています。つづいて、2つ前のコミットと最新のコミットの差分を見てみましょう。
git diff <2つ前のコミットID> <最新のコミットID>
$ git diff 9cba478c6ba35605d32dcbe7d16d5f12346c6de3 c0eb1705c3ec8520bbd0 66898d9580c4ffb71a69 diff --git a/file1.txt b/file1.txt index bfccc4a..8a585ea 100644 --- a/file1.txt +++ b/file1.txt @@ -1 +1,2 @@ This is file1. +New line in file1. $
2つ前のコミットと1つ前のコミットにはfile1.txtの行追加が差分として出力されています。
コミットログを参照する:git log
何度も登場しているgit logは今までのコミットのログ(履歴、以下ログで統一します)が参照できるコマンドです。
では、git diffのハンズオンで使用したカレントディレクトリを開きましょう。すでに何度も登場していますが、あらためて実行してみましょう。
git log
$ git log
commit c0eb1705c3ec8520bbd066898d9580c4ffb71a69 (HEAD -> main)
Author: Aoi <aoi@example.com>
Date: Fri Feb 21 08:00:19 2025 +0900
Add new line in file1
commit 9cba478c6ba35605d32dcbe7d16d5f12346c6de3
Author: Aoi <aoi@example.com>
Date: Thu Feb 20 22:35:37 2025 +0900
Add file1 and file2
~~~以下略~~~
今回はログの表示が短いですが、実際の開発現場ではもっと長いログも見られることでしょう。ログの表示が長くなると、ログをスクロールできるようになります。ログ表示から抜けられずに困ったら、キーボードの「q」を押してください。一番上に表示されているのが最新のコミットで、下に向かうにつれて過去のコミットを参照できます。コミットIDと、誰が、いつ、どんなコミットメッセージでコミットを行ったかを参照できます。


