第7回 | git diff で確認して変更を記録する | 動作確認からコミットまでをつなぐ|UNIX Cafe

* 当サイトでは、コンテンツの一部に広告を掲載しています。

System Note $ cat /proc/ai-disclosure

本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。

第7回 | git diff で確認して変更を記録する | 動作確認からコミットまでをつなぐ|UNIX Cafe

CLIで開発する | 第7回

前回は、テストで見つけた計算ミスを修正しました。アプリを実行し、テストも通るようになったので、処理としては修正された状態です。

ただし、開発では「直したら終わり」ではありません。何を変更したのかを読み返し、自分で説明できる状態にしてからGitに記録します。

今回は、前回直した src/calculator.py を題材に、git statusgit diffgit addgit commitgit log --oneline までを順番に使います。

Gitのコミットは、ただ保存する操作ではありません。「この変更は何を直したものか」を、あとから見返せる形で記録する操作です。

この記事で学べること

  • git status で変更済みファイルを確認する方法
  • git diff で変更内容を読む方法
  • git diff --staged で記録予定の差分を見る方法
  • テスト済みの変更を commit して履歴に残す流れ
目次

練習を始める前の準備

第6回で使った unix_cafe_order ディレクトリで作業を続けます。別の場所にいる場合は、作業用ディレクトリへ移動してください。

pwd
  • pwd は、現在いる場所を表示するコマンドです。
  • unix_cafe_order の中にいることを確認してから進めます。

次に、短い表示でGitの状態を確認します。

git status --short

第6回の修正がまだ記録されていない場合は、次のように表示されます。

 M src/calculator.py

先頭の M は、ファイルが変更されていることを表します。ここでは、src/calculator.py が変更済みです。

何も表示されない場合は、まだ変更がない状態です。第6回の記事に戻り、計算処理を修正するところまで進めてから、この記事に戻ってください。

なお、M の前に空白があるのは、まだ git add されていない変更だからです。今は「変更はあるが、まだ記録対象には入っていない」状態です。

git status で全体を見る

まずは、通常の git status で作業ツリー全体の状態を見ます。

git status

実行すると、次のような内容が表示されます。

On branch main
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:   src/calculator.py

no changes added to commit
  • ここで見るポイントは、modified: src/calculator.py です。
  • これは、src/calculator.py が変更されているが、まだ記録対象には選ばれていないという意味です。

git status は、作業全体を見渡すための入口です。どのファイルを変更したのか、記録対象に入っているのか、まだ入っていないのかを確認できます。

git diff で変更内容を読む

変更されたファイルが分かったら、次は中身を確認します。ここで使うのが git diff です。

git diff

git diff は、まだ git add していない変更内容を表示します。今回の例では、次のような差分が表示されます。

diff --git a/src/calculator.py b/src/calculator.py
index 8b0c0a1..2b4f4a2 100644
--- a/src/calculator.py
+++ b/src/calculator.py
@@ -1,5 +1,5 @@
 def calculate_total(orders):
     total = 0
     for order in orders:
-        total += int(order["price"])
+        total += int(order["price"]) * int(order["quantity"])
     return total
  • 差分のすべてを読む必要はありません。まずは、行の先頭にある -+ に注目します。
  • 先頭に - が付いた行が削除された内容、+ が付いた行が追加された内容です。

a/ は変更前、b/ は変更後を表すGitの表示上の名前です。実際に ab というフォルダが作られているわけではありません。

今回の変更では、価格だけを足していた行が、価格と数量を掛ける形に変わっています。

-        total += int(order["price"])
+        total += int(order["price"]) * int(order["quantity"])

この差分を見て、「数量を合計金額に反映するために、計算式へ quantity を追加した」と説明できます。

Gitに記録する前に、このように変更内容を一度読み返しておくと、後から履歴を見たときにも意味が分かりやすくなります。

記録前にテストをもう一度実行する

  • 差分を確認したら、テストももう一度実行します。
  • 前回すでに通していても、記録する直前に確認しておくと安心です。
python3 -m unittest discover -s tests -v

実行結果の最後に OK と表示されれば、テストは成功しています。

test_calculate_total (test_calculator.TestCalculator.test_calculate_total) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

ここまでで、「差分を読んだ」「テストも通った」という2つの確認ができました。次は、この変更をGitの記録対象に入れます。

git add で記録対象を選ぶ

  • git add は、今回のコミットに含める変更を選ぶ操作です。
  • 今回は src/calculator.py だけを記録します。

ここで注意したいのは、git add しただけでは、まだ履歴には記録されていないという点です。
記録として残るのは、次の git commit を実行したあとです。

git add src/calculator.py

git add を実行しても、成功した場合は何も表示されません。

そこで、記録対象に入ったかどうかを確認するため、もう一度 git status を実行します。

git status

今度は、次のように Changes to be committed の下に表示されます。

On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   src/calculator.py
  • Changes to be committed は、次のコミットに含まれる予定の変更です。
  • つまり、src/calculator.py は記録対象に入っています。

git diff --staged で記録予定を見る

  • git add した後は、普通の git diff では差分が表示されなくなることがあります。
  • これは、変更が記録対象に移動したためです。

記録対象に入っている差分を見るには、git diff --staged を使います。

git diff --staged

表示される差分は、先ほど確認した内容と同じです。

-        total += int(order["price"])
+        total += int(order["price"]) * int(order["quantity"])
  • git diff は、まだ git add していない変更を見ます。
  • git diff --staged は、すでに git add して、次のコミットに入る予定の変更を見ます。

コミット前に git diff --staged を読む習慣をつけると、余計な変更を混ぜたまま記録してしまう失敗を減らせます。

git commit で変更を記録する

  • 差分とテスト結果を確認できたので、変更をコミットします。
  • コミットメッセージは、何を直したのかが分かる短い文にします。
git commit -m "Fix order total calculation"
  • Fix order total calculation は、「注文合計の計算を修正した」という意味です。

実行すると、次のような結果が表示されます。

[main 4f2a1c8] Fix order total calculation
 1 file changed, 1 insertion(+), 1 deletion(-)
  • 1 file changed は、1つのファイルに変更があったことを表します。
  • 1 insertion(+)1 deletion(-) は、1行追加され、1行削除されたという意味です。

今回の修正は、計算式を1行置き換えた変更でした。そのため、追加1行、削除1行として記録されています。

git log --oneline で履歴を見る

コミットできたら、履歴を確認します。短く見るには git log --oneline を使います。

git log --oneline

履歴の先頭に、今作ったコミットが表示されます。

4f2a1c8 Fix order total calculation
9d1b7a3 Add calculator test
7c8e2d0 Add order total calculator

左側の短い英数字はコミットIDです。右側がコミットメッセージです。

  • ここまでで、計算ミスの修正がGitの履歴に残りました。

あとから見返したときも、Fix order total calculation というメッセージから、注文合計の計算を直した変更だと分かります。

最後に状態を確認する

コミット後は、作業中の変更が残っていないか確認します。

git status

次のように表示されれば、作業ディレクトリはきれいな状態です。

On branch main
nothing to commit, working tree clean

working tree clean は、未記録の変更が残っていないことを表します。今回の作業はここで完了です。

開発の流れとして整理する

今回の操作を、開発の流れとして整理すると次の順番になります。

  1. git status で変更済みファイルを見る
  2. git diff で変更内容を読む
  3. テストを再実行する
  4. git add で記録対象を選ぶ
  5. git diff --staged で記録予定の差分を見る
  6. git commit で履歴に残す
  7. git log --oneline で履歴を確認する

ポイントは、コミットの前に差分を読むことです。変更内容を自分の言葉で説明できる状態にしてから記録すると、Gitの履歴がただの保存場所ではなく、開発の記録として使いやすくなります。

手を動かすミニ練習

最後に、今回の内容を自分の環境でも確認してみてください。

  1. git statusgit diff の役割の違いを自分の言葉で説明してみる
  2. git add 後に git diff --staged を実行する
  3. コミット前に、変更内容を1文で説明する
  4. git log --oneline で作成したコミットを確認する

次回予告

次回は最終回です。小さな不具合を題材に、確認、探索、修正、テスト、差分確認、Git記録までを最初から最後まで通します。

さらに学びたいあなたへ

用途ごとに選ぶ Linux のおすすめ本

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

Created by UNIX Cafe

目次