Git でファイルに変更があるかどうかを確認する方法

GitGitBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Git リポジトリ内の変更を確認する方法を学びます。変更されたファイルを特定し、それらに加えられた具体的な変更を調べるために、重要な Git コマンド git statusgit diff を探索します。

実践的な演習を通じて、どのファイルが変更されたかを確認するために git status を使用し、ファイルの現在の状態と最後にコミットされたバージョンとの間の行単位の差分を表示するために git diff を使用する練習を行います。また、Git が変更されていないファイルを示す方法も学びます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git/BasicOperationsGroup -.-> git/add("Stage Files") git/BasicOperationsGroup -.-> git/status("Check Status") git/BasicOperationsGroup -.-> git/diff("Compare Changes") subgraph Lab Skills git/add -.-> lab-560022{{"Git でファイルに変更があるかどうかを確認する方法"}} git/status -.-> lab-560022{{"Git でファイルに変更があるかどうかを確認する方法"}} git/diff -.-> lab-560022{{"Git でファイルに変更があるかどうかを確認する方法"}} end

git status を実行して変更されたファイルを確認する

このステップでは、git status を使用してプロジェクト内で行った変更を確認する方法を学びます。

まず、プロジェクトディレクトリにいることを確認しましょう。ターミナルを開き、次のコマンドを入力します。

cd ~/project/my-time-machine

次に、新しいファイルを作成しましょう。message.txt ファイルに簡単な行を追加します。

echo "P.S. Hope you're doing well!" >> message.txt

>> 記号は、テキストを既存のファイルに追記します。上書きするのではありません。

変更を確認するために、ファイルの内容を確認しましょう。

cat message.txt

次のように表示されるはずです。

Hello, Future Me
P.S. Hope you're doing well!

では、Git がこの変更をどのように認識しているかを見てみましょう。git status コマンドを実行します。

git status

次のような出力が表示されるはずです。

On branch 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:   message.txt

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

Git は、message.txt が「modified(変更された)」ことを教えてくれます。これは、最後のコミット以来ファイルが変更されたことを Git が認識しているが、変更がまだステージングエリアに追加されていないことを意味します。

git status を理解することは非常に重要です。作業ディレクトリとステージングエリアの現在の状態を教えてくれるからです。行った変更とコミットの準備ができているものを把握するための主要なツールです。

git diff を使用して変更を調べる

前のステップで、git status がどのファイルが変更されたかを教えてくれることを見ました。では、具体的にどのような変更が行われたかを確認したい場合はどうすればいいでしょうか?そこで git diff が役に立ちます!

git diff は、作業ディレクトリと最後のコミット(または使用方法によってはステージングエリア)との間の差分を表示します。これは、ファイルの現在のバージョンと最後の保存ポイントのバージョンを比較するようなものです。

試してみましょう。まだ ~/project/my-time-machine ディレクトリにいることを確認して、次のコマンドを実行します。

git diff

次のような出力が表示されるはずです。

diff --git a/message.txt b/message.txt
index a1b2c3d..e4f5g6h 100644
--- a/message.txt
+++ b/message.txt
@@ -1 +1,2 @@
 Hello, Future Me
+P.S. Hope you're doing well!

この出力を解説しましょう。

  • diff --git a/message.txt b/message.txt:この行は、Git が message.txt ファイルの 2 つのバージョンを比較していることを示しています。
  • index a1b2c3d..e4f5g6h 100644:これはファイルのバージョンに関する技術的な情報です。
  • --- a/message.txt:これはファイルの元のバージョン(変更前)を示しています。
  • +++ b/message.txt:これはファイルの新しいバージョン(変更後)を示しています。
  • @@ -1 +1,2 @@:これは「ハンクヘッダー(hunk header)」と呼ばれます。ファイル内の変更がどこにあるかを示しています。-1 は、元のファイルの 1 行目から 1 行が削除されたことを意味し、+1,2 は、新しいファイルの 1 行目から 2 行が追加されたことを意味します。
  • +P.S. Hope you're doing well!+ で始まる行は追加された行を示します。行を削除した場合は、- で始まります。

git diff は非常に強力なツールです。変更をコミットする前に、常に git diff を実行して、保存しようとしている内容を正確に確認することをおすすめします。これにより、意図しない変更を誤ってコミットするのを防ぐことができます。

q を押して差分表示を終了し、コマンドラインに戻ります。

変更されていないファイルをテストする

前のステップで、ファイルが変更された場合の git statusgit diff の動作を見ました。では、変更がない状態でこれらのコマンドを実行するとどうなるでしょうか?

確認してみましょう!~/project/my-time-machine ディレクトリにいることを確認します。

まず、git status を実行します。

git status

前回のステータス確認以来、何も変更を加えていないため、前と同じ出力が表示され、message.txt が変更されているがステージングされていないことが示されます。

On branch 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:   message.txt

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

次に、再度 git diff を実行してみましょう。

git diff

前と同じ差分出力が表示され、現在のファイルと最後のコミットとの違いが示されます。

diff --git a/message.txt b/message.txt
index a1b2c3d..e4f5g6h 100644
--- a/message.txt
+++ b/message.txt
@@ -1 +1,2 @@
 Hello, Future Me
+P.S. Hope you're doing well!

これにより、git statusgit diff は、さらに変更を加えずにコマンドを何度実行しても、最後のコミットに対する作業ディレクトリの現在の状態を表示することが確認できます。

次に、git add を使用して message.txt に加えた変更をステージングしましょう。

git add message.txt

再度 git status を実行します。

git status

出力は、変更が現在ステージングされていることを示すように変わります。

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   message.txt

git status が「Changes to be committed」を表示していることに注意してください。これは、変更がステージングエリアにあり、次のコミットの準備ができていることを意味します。

では、今度は git diff はどうなるでしょうか?試してみましょう。

git diff

今回は、git diff は何も出力しません。なぜでしょうか?git diff を引数なしで実行すると、作業ディレクトリとステージングエリアを比較するからです。先ほど変更をステージングエリアに追加したので、作業ディレクトリとステージングエリアは同じになっています。

ステージングエリアと最後のコミットとの差分を見るには、git diff --staged を使用します。試してみましょう。

git diff --staged

これにより、現在ステージングエリアにある変更の差分が表示されます。これは、追加した行です。

diff --git a/message.txt b/message.txt
index a1b2c3d..e4f5g6h 100644
--- a/message.txt
+++ b/message.txt
@@ -1 +1,2 @@
 Hello, Future Me
+P.S. Hope you're doing well!

git diff(作業ディレクトリ vs. ステージングエリア)と git diff --staged(ステージングエリア vs. 最後のコミット)の違いを理解することは、Git の重要な概念です。これにより、コミットする前に変更を管理するのに役立ちます。

差分表示が表示された場合は、q を押して終了します。

まとめ

この実験では、Git リポジトリ内の変更を確認する方法を学びました。まず、git status を使用して、最後のコミット以降に作業ディレクトリ内で変更されたファイルを特定しました。このコマンドは、リポジトリの現在の状態の概要を提供し、変更されたファイル、ステージングされたファイル、および追跡されていないファイルを示します。

次に、git diff を使って、変更されたファイル内で行われた具体的な変更を調べました。このコマンドは、作業ディレクトリ内のファイルの現在のバージョンと最後のコミットのバージョンとを行ごとに比較し、追加された行と削除された行を強調表示します。最後に、リポジトリ内のファイルに変更が加えられていない場合、git status が正しく変更なしを報告することを確認しました。