このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:Gitの基本的な使い方

Gitの基本的な使い方

 Linux環境で作業をしていると、ファイルの変更履歴を効率的に管理したい場面が多々あります。Gitを使えば、いつ、誰が、どんな修正を行ったのかを明確に履歴として残し、過去の状態にも簡単に戻れます。ここでは、logview.shというシェルスクリプトをバージョン管理対象として、Gitの基本的な使い方を解説します。

リポジトリの作成

 Gitでバージョン管理を始めるには、まず「リポジトリ」を用意します。リポジトリとは、ファイルの変更履歴を記録する「倉庫」のような場所で、.gitというディレクトリとして存在します。

1.作業用ディレクトリの作成

まずは作業用のディレクトリを作ります。ここではlogviewというディレクトリを用意します。

user01@ubuntu:~$ mkdir -p ~/git/logview

mkdir -pにより、必要な上位ディレクトリがない場合でもまとめて作成できます。

2.リポジトリの初期化 (git init)

作成したlogviewディレクトリに移動し、git initコマンドでリポジトリを初期化します。

user01@ubuntu:~$ cd ~/git/logview
user01@ubuntu:~/git/logview$ git init
(省略)
Initialized empty Git repository in /home/user01/git/logview/.git/
  • これで.gitディレクトリが作成され、この中にすべての変更履歴が保存されます。
  • .gitディレクトリはGitの内部情報を保持し、ユーザーが直接編集することはありません。

リポジトリとワークツリー

gitディレクトリが作成される

git initは初期化のためのコマンドで、実行すると.gitというディレクトリが作成されます。

user01@ubuntu:~/git/logview$ ls -a
.  ..  .git

 Gitでは、変更履歴が記録される「リポジトリ」と、実際にファイルを編集するための「ワークツリー」が明確に分けられています。

ディレクトリ構成役割
~/git/logview/.git/リポジトリ(履歴)
~/git/logview/ワークツリー(作業場)
  • リポジトリ:ファイルの過去・現在の状態や差分を内部的な形式で保存
  • ワークツリー:リポジトリから取り出したファイルを実際に編集する場所

 ファイルの編集や追加はワークツリーで行い、その変更をgit addgit commitでリポジトリに反映します。

バージョン管理対象ファイル(logview.sh)の準備

 ここでバージョン管理するファイルは、logview.shというシェルスクリプトです。完成バージョンは以下のような内容で、/var/logディレクトリ内の特定ログファイルをリアルタイム表示する簡単なツールです。

 logview.shというシェルスクリプトの詳しい解説は「システムログ情報を簡単に確認するシェルスクリプト」を参考にしてください。

#!/bin/bash

# ログファイルのディレクトリ
logdir="/var/log"

# 利用可能なログファイルの一覧を取得
logs=$(ls $logdir | grep -E 'syslog|auth.log|dmesg')

echo "表示可能なログファイル一覧:"
echo "$logs"

# ユーザーに表示したいログファイルを選択させる
echo -n "表示したいログファイルを入力してください: "
read logfile

# ファイルの存在確認
if [ ! -e "${logdir}/${logfile}" ]; then
    echo "エラー: ログファイル '${logfile}' が存在しません。"
    exit 1
fi

# ログファイルをリアルタイムで表示
echo "ログファイル '${logfile}' を表示します。終了するには Ctrl+C を押してください。"
tail -f "${logdir}/${logfile}"

 ただし初回は、すべてを入力する必要はありません。まずは初期バージョンとして、以下の10行のみを入力します。

初期バージョンのlogview.sh(10行分)

#!/bin/bash

# ログファイルのディレクトリ
logdir="/var/log"

# 利用可能なログファイルの一覧を取得
logs=$(ls $logdir | grep -E 'syslog|auth.log|dmesg')

echo "表示可能なログファイル一覧:"
echo "$logs"

これら10行をワークツリーに作成します。

touchで空ファイルを作成、chmod 755で実行権限付与、nanoで内容を編集し保存します。

user01@ubuntu:~/git/logview$ touch logview.sh
user01@ubuntu:~/git/logview$ chmod 755 logview.sh
user01@ubuntu:~/git/logview$ nano logview.sh
# nanoエディタを開き、上記10行を入力して保存

ファイルをリポジトリに追加する(git addgit commit

 ワークツリーにlogview.shができただけでは、まだGitはこのファイルをバージョン管理していません。バージョン管理するには、git addでコミット対象として指定し、git commitで実際にリポジトリに履歴として残します。

1.git addでステージング

 git addは、リポジトリに記録したいファイルを「ステージ」という待機領域に登録するコマンドです。

user01@ubuntu:~/git/logview$ git add logview.sh

これでlogview.shは次にコミットされる準備が整いました。

2.git commitで履歴として保存

 git commitコマンドでステージされた変更をリポジトリに保存します。-mオプションで変更内容を示すメッセージを付けることができます。

user01@ubuntu:~/git/logview$ git commit -m "logview.sh新規作成"
[master (root-commit) 09e7989] logview.sh新規作成
 1 file changed, 10 insertions(+)
 create mode 100755 logview.sh

 これでlogview.shの初期バージョンがリポジトリにコミットされました。これ以降、この状態を簡単に参照したり、差分を表示したり、過去状態に戻したりできます。この「過去の状態」を表す単位を「リビジョン」と呼びます。


コミット前の変更確認とスクリプトの修正

 ここまでに、logview.shというファイルをリポジトリに追加して初回のコミットを行いました。この後は、ファイルを修正した際に、その変更内容を確認し、再度コミットして履歴を進める方法を解説します。

ワークツリーの状態確認(git status

 ファイルを修正した場合、実際にコミットする前に今どのような変更が行われているかを確認することができます。git statusコマンドは、ワークツリーとステージ(git add実行後の待機領域)の状態を表示します。

現在のワークツリーの確認

user01@ubuntu:~/git/logview$ git status
ブランチ master
nothing to commit, working tree clean

logview.shの修正

 別の修正を行って、もう一度コミットしてみます。エディタでlogview.shファイルを開いて、現在のスクリプトの末尾に4行のスクリプト追加して内容を次のように変更します。

user01@ubuntu:~/git/logview$ nano logview.sh 

追加するスクリプト

#!/bin/bash

# ログファイルのディレクトリ
logdir="/var/log"

# 利用可能なログファイルの一覧を取得
logs=$(ls $logdir | grep -E 'syslog|auth.log|dmesg')

echo "表示可能なログファイル一覧:"
echo "$logs"

# ユーザーに表示したいログファイルを選択させる
echo -n "表示したいログファイルを入力してください: "
read logfile

ワークツリーの状態を表示する

 再び、ファイルをコミットしますが、その前に、git statusコマンドでを使って、現在のワークツリーの状態を確認します。

user01@ubuntu:~/git/logview$ git status 
ブランチ master
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:   logview.sh

no changes added to commit (use "git add" and/or "git commit -a")

 出力結果には、modified: logview.shと表示され、logview.shが修正されていることがわかります。現時点では、まだgit addを実行していないため、ステージには変更が取り込まれていません。

差分表示(git diff

 修正をコミットする前に、どのような変更が行われたかを確認したい場合はgit diffコマンドが有用です。差分は「ユニファイド形式」で表示され、どの行が追加・削除・変更されたかが明確にわかります。

「ユニファイド形式」については、「ユニファイド出力形式:diffコマンド」を参考にしてください。

user01@ubuntu:~/git/logview$ git diff
diff --git a/logview.sh b/logview.sh
index 6892ec1..677c18f 100755
--- a/logview.sh
+++ b/logview.sh
@@ -8,3 +8,7 @@ logs=$(ls $logdir | grep -E 'syslog|auth.log|dmesg')
 
 echo "表示可能なログファイル一覧:"
 echo "$logs"
+
+# ユーザーに表示したいログファイルを選択させる
+echo -n "表示したいログファイルを入力してください: "
+read logfile

 ここでは新たに4行追加されていることがわかります。このようにコミット前に差分を確認することで、不要な変更や入力ミスに気づくことができます。

再度コミットする流れ

差分を確認して問題がなければ、再度git addgit commitで変更内容をコミットします。

1.git addでファイルをステージ

user01@ubuntu:~/git/logview$ git add logview.sh

これでlogview.shの変更が次のコミット対象として確定されます。

2.git commitでコミット、 今回は-mオプションをつけず、git commitをそのまま実行

-mオプションをつけず、git commitをそのまま実行します。

user01@ubuntu:~/git/logview$ git commit

 -mオプションを省略すると、デフォルトのエディタ(Ubuntuでは通常nano)が起動し、コミットに対するログメッセージを編集できます。 ログメッセージは以下の形式が一般的です。

  • 1行目:変更の概要
  • 2行目:空行
  • 3行目以降:変更の詳細や理由

 コメント行(#で始まる行)は無視されるため、参考情報として残しておけます。 ログメッセージを入力し、エディタを保存・終了すると、コミットが完了します。

コミットに対するログメッセージを以下のように上から3行目に入力し、保存して終了します。

ユーザーに表示したいログファイルを選択させるようにする

表示したいログ番号を読み取る処理を追加するため
# Please enter the commit message for your changes. Lines starti>
# with '#' will be ignored, and an empty message aborts the comm>
#
# ブランチ master
# コミット予定の変更点:
#       modified:   logview.sh
#

再度コミット

再度、git commitを使ってコミットします。

user01@ubuntu:~/git/logview$ git commit
ブランチ master
nothing to commit, working tree clean

これでコミットが完了し、リポジトリにはさらに履歴が蓄積されました。

コミット履歴の確認(git log

 履歴を確認するにはgit logコマンドを使用します。git log-pオプションを指定すると、コミットごとの差分もあわせて表示されます。

 git logは、最新のコミットから過去にさかのぼって履歴を表示します。各コミットには、コミットID(オブジェクト名)・Author・日時・メッセージが含まれており、どのような変更が、いつ、誰によって行われたかを簡単に把握できます。

user01@ubuntu:~/git/logview$ git log -p
commit 9d389a113d7bc3dc96d8887a408b058300b4d031 (HEAD -> master)
Author: user01 <user01@example.com>
Date:   Sun Dec 8 00:42:06 2024 +0900

    ユーザーに表示したいログファイルを選択させるようにする
    
    表示したいログ番号を読み取る処理を追加するため

diff --git a/logview.sh b/logview.sh
index 6892ec1..677c18f 100755
--- a/logview.sh
+++ b/logview.sh
@@ -8,3 +8,7 @@ logs=$(ls $logdir | grep -E 'syslog|auth.log|dmesg')
 
 echo "表示可能なログファイル一覧:"
 echo "$logs"
+
+# ユーザーに表示したいログファイルを選択させる
+echo -n "表示したいログファイルを入力してください: "
+read logfile

commit 4bc21c97820335f76c9401ee75ca84899f384f1d
Author: user01 <user01@example.com>
:

qキーを押して終了させます。

特定のコミットからの差分表示

  • git diffは、オブジェクト名(コミットID)を指定することで、特定のコミット以降の差分を表示できます。
  • コミットIDは40文字もありますが、先頭から数文字で一意に決まる場合、短縮して指定できます。
user01@ubuntu:~/git/logview$ git diff 4bc21c
diff --git a/logview.sh b/logview.sh
index 6892ec1..677c18f 100755
--- a/logview.sh
+++ b/logview.sh
@@ -8,3 +8,7 @@ logs=$(ls $logdir | grep -E 'syslog|auth.log|dmesg')
 
 echo "表示可能なログファイル一覧:"
 echo "$logs"
+
+# ユーザーに表示したいログファイルを選択させる
+echo -n "表示したいログファイルを入力してください: "
+read logfile

まとめ

これまで登場した基本コマンドをまとめます。

以下のコマンドを組み合わせることで、Gitによる基本的なバージョン管理作業が可能となります。

基本的なGitコマンド一覧表

コマンド役割・解説
git initリポジトリを作成します。以後このディレクトリでGitによるバージョン管理が可能になります。
git addコミット対象としてファイルをステージします。git commitにより履歴に残す候補を決定するコマンドです。
git commitステージされた変更をリポジトリに履歴として保存(コミット)します。-mでメッセージ指定、未指定時はエディタが起動します。
git statusワークツリーとステージの状態を表示します。修正箇所や未コミットの変更がひと目で分かります。
git diff未コミットの変更や指定したコミットとの差分を表示します。変更箇所をチェックしてからコミットできます。
git log履歴を表示します。誰がいつ何を変更したかや、コミットメッセージを一覧できます。-pオプションで差分も表示可能です。

 ここまで理解すれば、ファイルを変更するたびにgit addgit commitで履歴に残し、git diffgit logでその履歴を確認するといった基本的なフローを習得できます。