Git Diff の詳細解説

GitGitBeginner
今すぐ練習

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

はじめに

Git エクスプローラー、ようこそ!今日は、Git の最も強力で頻繁に使用される機能の 1 つである git diff コマンドを深く掘り下げます。ファイルに対してどのような変更を加えたのか疑問に思ったことがあるか、またはコードの異なるバージョンを比較する必要があった場合、git diff があなたが探していたツールです。

git diff コマンドは、コードの変更に対する顕微鏡のようなものです。作業ディレクトリ、ステージング エリア、コミット間、さらにはブランチ間のさまざまな状態の正確な違いを見ることができます。

この実験では、以下の方法を学びます。

  1. 作業ディレクトリとステージング エリアを比較する
  2. ステージング エリアと最後のコミットを比較する
  3. 異なるブランチを比較する
  4. 特定のファイルを比較する
  5. より視覚的な比較のために外部の差分ツールを使用する

この実験が終わるとき、あなたは git diff の専門家になっており、変更を精度と自信を持って吟味することができるようになります。このスキルは、作業のレビュー、コミットの準備、および他の人と効果的に協力するために不可欠です。

さあ、一緒に git diff の力を探り始めましょう!


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/SetupandConfigGroup(["Setup and Config"]) git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/SetupandConfigGroup -.-> git/config("Set Configurations") git/SetupandConfigGroup -.-> git/init("Initialize Repo") git/BasicOperationsGroup -.-> git/add("Stage Files") git/BasicOperationsGroup -.-> git/commit("Create Commit") git/BasicOperationsGroup -.-> git/diff("Compare Changes") git/BranchManagementGroup -.-> git/branch("Handle Branches") subgraph Lab Skills git/config -.-> lab-387489{{"Git Diff の詳細解説"}} git/init -.-> lab-387489{{"Git Diff の詳細解説"}} git/add -.-> lab-387489{{"Git Diff の詳細解説"}} git/commit -.-> lab-387489{{"Git Diff の詳細解説"}} git/diff -.-> lab-387489{{"Git Diff の詳細解説"}} git/branch -.-> lab-387489{{"Git Diff の詳細解説"}} end

作業環境のセットアップ

差分を比較する前に、比較対象のファイルとコミットを含む作業環境をセットアップしましょう。新しいディレクトリを作成し、Git リポジトリを初期化し、複数のコミットを含むいくつかのファイルを追加します。

ターミナルを開き、次のコマンドを入力します。

cd ~/project
mkdir git-diff-lab
cd git-diff-lab
git init

次に、いくつかのファイルを作成し、次のコマンドをコピーして貼り付けて一連のコミットを行います。

echo "## Git Diff Lab" > README.md
git add README.md
git commit -m "Initial commit"

echo "function greet(name) {" > greet.js
echo "  return 'Hello, ' + name + '!';" >> greet.js
echo "}" >> greet.js
git add greet.js
git commit -m "Add greet function"

echo "const numbers = [1, 2, 3, 4, 5];" > numbers.js
echo "console.log(numbers);" >> numbers.js
git add numbers.js
git commit -m "Add numbers array"

さっきやったことを分解してみましょう。

  1. README ファイルを作成し、最初のコミットを行いました。
  2. 挨拶関数を含む JavaScript ファイルを作成し、コミットしました。
  3. 数字の配列を含む別の JavaScript ファイルを作成し、コミットしました。

これで、調査対象の履歴があるリポジトリができました!

作業ディレクトリとステージング エリアの比較

git diff の最も基本的な使い方は、まだステージングされていない作業ディレクトリの変更を確認することです。これを見てみましょう。

まず、greet.js ファイルにいくつかの変更を加えましょう。

echo "function farewell(name) {" >> greet.js
echo "  return 'Goodbye, ' + name + '!';" >> greet.js
echo "}" >> greet.js

次に、git diff を使ってこれらの変更を確認しましょう。

git diff

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

diff --git a/greet.js b/greet.js
index 95f5574..a3641f6 100644
--- a/greet.js
+++ b/greet.js
@@ -1,3 +1,7 @@
 function greet(name) {
   return 'Hello, ' + name + '!';
 }
+function farewell(name) {
+  return 'Goodbye, ' + name + '!';
+}

この出力を分解してみましょう。

  • 最初の行は比較対象のファイルを示しています。
  • +++--- の行は比較対象のファイル バージョンを示しています(a/ は元のバージョン、b/ は新しいバージョン)。
  • @@ の行はファイル内の変更箇所のコンテキストを提供しています。
  • + で始まる行は追加内容を示し、- は削除内容を示します。

この差分は、greet.js に 3 行の新しいコードが追加されたことを示しています。

差分ビューを終了するには q を押します。

次に、これらの変更をステージングしましょう。

git add greet.js

もう一度 git diff を実行すると、出力が表示されないはずです。これは、git diff は既定で未ステージングの変更のみを表示するためです。ステージングされた変更を確認するには、次の手順で説明する git diff --staged を使用する必要があります。

覚えておいてください。引数なしで git diff を実行すると、作業ディレクトリとステージング エリアを比較します。変更をステージングする前に変更を確認するのに便利な方法です。

ステージング エリアと最後のコミットの比較

これで変更をステージングしたので、ステージング エリアと最後のコミットを比較する方法を学びましょう。これは、次のコミットに含まれる変更を確認するのに役立ちます。

ステージング エリアと最後のコミットの違いを確認するには、次のコマンドを使用します。

git diff --staged

前のステップで見たものと同じような出力が表示され、farewell 関数の追加が示されるはずです。

このコマンドは、時間をかけて変更をステージングし、次のコミットに含まれるすべての内容を確認したい場合に特に便利です。

この機能がどのように機能するかを確認するために、別の変更を加えてステージングしましょう。

echo "console.log(greet('World'));" >> greet.js
git add greet.js

次に、git diff --staged を実行すると、farewell 関数と新しい console.log 行の両方が表示されます。

覚えておいてください。git diff --staged(または同義の git diff --cached)は、最後のコミットと比較して、現在ステージング エリアにある変更を示します。コミットする前にステージングされた変更を二重チェックするのに便利な方法です。

ブランチの比較

Git diff は、異なるブランチを比較する際にも便利です。特に、機能ブランチで作業しており、メイン ブランチとどのように異なるかを確認したい場合に役立ちます。

新しいブランチを作成していくつかの変更を加えましょう。

git checkout -b feature-branch
echo "const PI = 3.14159;" >> numbers.js
git add numbers.js
git commit -m "Add PI constant"

次に、このブランチとメイン ブランチを比較しましょう。

git diff master feature-branch

numbers.jsPI 定数が追加されていることを示す出力が表示されるはずです。

このコマンドは、masterfeature-branch ブランチの先端の違いを示します。つまり、「master にはないが feature-branch にある変更を表示してください」という意味です。

最初のブランチ名を省略することで、現在のブランチと別のブランチを比較することもできます。

git diff master

これは、現在のブランチ (feature-branch) と master を比較します。

ブランチを比較する際のポイントを覚えておいてください。

  • 最初のブランチ(省略された場合は現在のブランチ)にあるが、2番目のブランチにはない変更は削除として表示されます(- で示されます)。
  • 2番目のブランチにあるが、最初のブランチにはない変更は追加として表示されます(+ で示されます)。

この機能は、ブランチをマージする準備をする際や、機能ブランチがどのような変更を導入するかを確認したい場合に非常に便利です。

特定のファイルの比較

時には、特定の1つまたは複数のファイルの変更を確認したい場合があります。Git diffを使えば、簡単にこれができます。

複数のファイルに変更を加えましょう。

echo "function multiply(a, b) { return a * b; }" >> greet.js
echo "const doubledNumbers = numbers.map(n => n * 2);" >> numbers.js

次に、greet.js のみの変更を確認したい場合は、以下のコマンドを使えます。

git diff greet.js

これにより、greet.js に加えられた変更のみが表示されます。

また、ブランチ間の特定のファイルを比較することもできます。

git diff master feature-branch -- numbers.js

これは、master ブランチと feature-branch ブランチの間の numbers.js の違いを示します。

上記のコマンドにおける -- は、ファイル パスとブランチ名を区切るために使用されます。必ずしも必要なわけではありませんが、曖昧さを避けるために使用するのは良い習慣です。特に、ファイル名がブランチ名と間違えられる可能性がある場合には役立ちます。

覚えておいてください。学んだdiffコマンドのいずれにもファイル パスを使うことができます。これは、多くのファイルに変更があるが、いくつかのファイルにのみ焦点を当てたいというような、大規模なプロジェクトで特に役立ちます。

外部の差分ツールの使用

Gitの組み込みの差分表示機能は強力ですが、時には変更内容をより視覚的に表現したい場合があります。多くの開発者はこの目的で外部の差分ツールを使用しています。

人気のあるツールの1つが vimdiff です。Gitを設定して vimdiff を使用するには、以下のコマンドを実行します。

git config --global diff.tool vimdiff
git config --global difftool.prompt false

これで、git diff の代わりに git difftool を使用できるようになります。

git difftool

これにより、vimdiff で各変更されたファイルが開きます。次のファイルに移動するには :n、前のファイルに移動するには :prev を使用します。vimdiff を終了するには :qa! を使用します。

Beyond Compare、KDiff3、P4Merge など、他にもたくさんの差分ツールがあります。ツールの選択は、主に個人的な好みとオペレーティング システムに依存します。

視覚的な差分ツールは、特に大きな変更の場合に非常に役立つことがありますが、必ずしも必要なわけではありません。多くの開発者は、標準の git diff の出力に慣れており、日常的な使い方ではその速度と簡素さが好まれています。

まとめ

おめでとうございます、差分探偵!あなたはこれまで git diff の世界を深く掘り下げてきました。ここで扱った重要な概念を振り返りましょう。

  1. 作業ディレクトリとステージング エリアの比較:作業ディレクトリにある未ステージングされた変更を確認する方法を学びました。
  2. ステージング エリアと最後のコミットの比較:コミットする前にステージングされた変更を確認する方法を見つけました。
  3. ブランチの比較:異なるブランチを比較して、どのように分岐しているかを確認する方法を学びました。
  4. 特定のファイルの比較:差分表示を関心のある特定のファイルに絞る方法を学びました。
  5. 外部の差分ツールの使用:変更内容を別の視点から見るために視覚的な差分ツールを使用する方法を探りました。

git diff コマンドは、Gitツールキットにおける強力なツールです。コミットの準備をしているとき、同僚の作業をレビューしているとき、またはプロジェクトの履歴を理解しようとしているときに、精度よく変更を調べることができます。

覚えておいてください。git diff に精通するには練習が必要です。最初は出力が分かりにくく見えても諦めないでください。時間が経つにつれて、迅速かつ効率的に差分を読み取ることができるようになります。

Gitの旅を続けるにあたり、git diff のさまざまなオプションとユースケースを引き続き探求してください。これは多用途のコマンドであり、他の多くのGit機能と組み合わせて、プロジェクトの変更に関する深い洞察を得ることができます。

楽しい差分表示をお祈りします。あなたのコードの変更が常に明確で意図的でありますように!