プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

git diffコマンド完全ガイド:コミット・ブランチ・ファイルの差分比較をマスターしよう

git diffコマンドは、2つのコミット間のファイルの違いや、現在のリポジトリと過去のコミットとの差分を表示するコマンドです。変更があったファイルについて、ヘッダーやメタデータとともに変更内容を出力します。

Gitでバージョン管理を行っていると、リポジトリ内のデータと別のデータソースを比較したくなることがあります。例えば、2つの異なるコミット同士を比較したり、2つのファイルを比較したりするケースです。

そんなときに役立つのがdiff機能です。diffは2つの入力を受け取り、そのデータソース間に存在する変更点を表示する機能です。ブランチ、ファイル、コミットに対してdiffを実行できます。

この記事では、具体例を交えながらGitでのdiffの基本と、git diffコマンドの使い方を解説します。読み終える頃には、git diffコマンドを使いこなせるようになっているでしょう。

git diffコマンドとは

git diffコマンドは、2つのコミット間のファイルの差分、またはコミットと現在のリポジトリとの差分を表示します。ファイルに追加されたテキスト、削除されたテキスト、変更されたテキストを確認できます。

git diffコマンドの基本的な構文は以下の通りです。

git diff

デフォルトでは、git diffコマンドはリポジトリ内の未コミットの変更をすべて表示します。元のファイルから削除された行や、追加・変更された行を確認できるのです。実際、Gitのdiffはリポジトリ内のブランチ同士の比較によく使われます。

コミット間の差分を比較する

2つのGitコミット間でファイルを比較するには、比較したいコミットを参照するref(参照)の名前を指定します。refにはコミットIDや、現在のブランチを指すHEADなどが使用できます。

git diff <commit1> <commit2>

それでは、Gitリポジトリ内の2つのコミットを比較してみましょう。

まず、比較したいコミットのIDを取得する必要があります。これには、リポジトリ内のすべてのコミットの簡潔な一覧を返す「git log --pretty=oneline」コマンドを使用します。

git log --pretty=oneline

このコマンドは次のような結果を返します。

5141ea9c41cdc7152408bfcab54a910f34441855 (HEAD -> master) feat: Update README.md
749055ee99df2aa6f5adc4cbe4bfc708395f1c2e docs: Create README.md

ここで、この2つのコミットを比較したいとしましょう。その場合は、次のコマンドを使用します。

git diff 5141ea9c41cdc7152408bfcab54a910f34441855 749055ee99df2aa6f5adc4cbe4bfc708395f1c2e

上記のコマンドを実行すると、2つのコミット間でdiff操作が実行されます。

ブランチ間の差分を比較する

diffコマンドで2つのGitブランチを比較するには、比較したい2つのブランチ名を引数として指定します。ブランチ名の間にはドット2つ(..)を挟みます。このドットは、各ブランチの最新コミットを読み取って比較することを意味します。

git diff <branch1>..<branch2>

例えば、リポジトリ内の「master」ブランチと「dev-v0.9」というブランチを比較したい場合は、次のコマンドを使用します。

git diff master dev-v0.9

このコマンドを実行すると、「master」ブランチと「dev-v0.9」ブランチの間でdiffが実行されます。

同様に、2つの異なるブランチ間で特定のファイルだけを比較することも可能です。その場合は上記と同じ構文に加えて、比較したいファイルを指定します。

例えば、「master」ブランチと「dev-v0.9」ブランチ間でREADME.mdファイルを比較したい場合は、次のように記述します。

git diff master dev-v0.9 ./README.md

これにより、カレントディレクトリ(「./」で表される)にあるREADME.mdファイルが、「master」ブランチと「dev-v0.9」ブランチ間で比較されます。

git diffコマンドの実行例

ここでは、空のリポジトリを初期化し、README.mdファイルから始めるケースを想定します。リポジトリに作成したREADME.mdファイルには、次の一文が含まれています。

This is an example of the Git diff feature.

ファイルとコミットの準備

まず、git commitコマンドを使って、このファイルでコミットを作成します。

git commit

これにより、リポジトリへの変更内容が保存されます。Gitは次のような結果を返します。

[master (root-commit) 749055e] docs: Create README.md
1 file changed, 1 insertion(+)
create mode 100644 README.md

この段階でgit diffコマンドを実行しても、何も表示されません。これはリポジトリが初期化されたばかりで、ファイル間に変更がないためです。ここからリポジトリ内のファイルの内容を変更すれば、git diffコマンドの動作を確認できます。

例えば、README.mdファイルに「We just added this line to our file.」という文を追加したいとしましょう。その場合は、次のコマンドを使用します。

echo "We just added this line to our file." >> README.md

上記のコマンドにより、README.mdファイルに文が追加されました。

これで、最初のREADME.mdファイルと、リポジトリ内の現在のREADME.mdファイルとの間に差分が生まれました。

git diffコマンドを実行すれば、この2つのファイルの差分を確認できます。デフォルトでは、git diffコマンドは最新のコミットとリポジトリの現在の状態との間の、全ファイルの差分を出力します。

コミット間でdiffを実行する

コマンドを実行すると、次のような結果が返されます。

diff --git a/README.md b/README.md
index f808522..f08e544 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
 This is an example of the Git diff feature.
+We have just added this line to our file.

これはgit diffコマンドの典型的な出力結果です。この結果には、結合diff形式でファイルに追加または削除された内容が表示されています。

git diffコマンドは、最後のコミットと現在のリポジトリの間にある、すべてのファイルの変更点の一覧を返します。

特定のファイルへの変更だけを取得したい場合は、そのファイルを第3パラメータとして指定します。例えば、README.mdファイルへの変更だけを確認したい場合です。

この例ではREADME.mdファイルしか変更していないため、結果的に表示されるのはその変更だけですが、規模の大きなリポジトリで作業している場合は、1つのファイルの変更だけを比較したいこともあるでしょう。その場合は、次のコマンドを使用します。

git diff README.md

このコマンドにより、README.mdファイルの現在のバージョンと、最後にコミットされたバージョンを比較できます。

git diffの出力結果の読み方

Gitのdiff出力には、リポジトリ内のファイル間の変更を分析するために使える複数の構成要素があります。先ほどの例を参考に、それぞれを見ていきましょう。

入力ファイル

diffの最初の構成要素は入力ファイルです。この部分には、diffでどのファイルが比較されているかが示されます。

この例では、現在のコードのREADME.mdファイルと、直前のバージョンのREADME.mdファイルを比較しています。これは出力の1行目に記載されています。

diff --git a/README.md b/README.md

メタデータ

次に、diffにはGitリポジトリのメタデータが含まれます。このメタデータには、ファイルへの変更を追跡するためにGitが使用するオブジェクトのバージョンラベルが表示されます。

この情報は、ほとんどの場合あまり使われることはありません。先ほどの例では、メタデータは次のようになっています。

index f808522..f08e544 100644

変更マーカー

diff出力の次の部分は変更マーカーです。これらのファイルパターンマーカーは、ファイルにどのような種類の変更が加えられたかを示します。先ほどの例の変更マーカーは次の通りです。

--- a/README.md
+++ b/README.md

これらのマーカーは、a/README.mdからの変更(マイナス記号で示される)が、b/README.mdに反映されている(プラス記号で示される)ことを表しています。

コードの変更内容

最後に、diffはコードへの変更内容の一覧を返します。ファイル全体の比較とは異なり、diffはファイルのうち変更されたセクションのみを表示します。この例ではファイルに1行追加したため、次のような結果が返されました。

@@ -1 +1,2 @@
 This is an example of the Git diff feature.
+We have just added this line to our file.

最初の行は、ファイルへの変更内容のサマリーです。これは、2行目(2)から始まる位置に1行のコードを追加した(+1)ことを意味します。

その後、変更内容の一覧が表示されます。ご覧の通り、「We have just added this line to our file.」という行を追加したため、その行がdiffに表示されています。先頭のプラス記号は、その行がファイルに追加されたことを示しています。

まとめ

diffは、Gitリポジトリ内の2つのファイル、ブランチ、またはコミットを比較できる便利な機能です。これにより、リポジトリのある時点以降に行われた変更を確認できます。

この記事では、Gitでのdiffの基本と、git diffコマンドを使ってdiff操作を行う方法を解説しました。これであなたも、git diffコマンドをエキスパートのように使いこなすための知識を身につけたはずです。

  1. Git cherry-pickの使い方をステップバイステップで解説

    開発を始めたばかりの頃、多くの人はgitのコマンドを繰り返し使う中で自然と覚えていきます。git pull、git push、git commitといった基本的なコマンドの意味はすぐに理解できるでしょう。しかし、規模の大きいプロジェクトに参加し、チームで開発するようになると、コードベースのバージョン管理履歴を整理された状態に保つために、より高度なgitコマンドを学ぶ必要が出てきます。 そのようなコマンドの一つが「git cherry-pick」です。このコマンドは、あるブランチから特定のコミットだけを取り出し、別のフィーチャーブランチやmasterブランチのHEADに適用したい場合に使用しま

  2. SQL CREATE TABLE文の使い方:基本構文と実例で学ぶテーブル作成ガイド

    SQLのCREATE TABLE文は、データベースに新しいテーブルを追加するためのステートメントです。この文を使うことで、新しく作成するテーブルのカラム(列)名や、各カラムに格納できるデータ型を指定できます。さらに、テーブル内でのデータの扱いに関する制約(コンストレイント)も定義することが可能です。 データベースに対してクエリを実行したりデータを保存したりする前に、まずはデータを格納するためのテーブルを作成する必要があります。テーブルは、データベース内のすべてのデータが保存される場所であり、各レコード(行)ごとの情報がここに蓄積されていきます。 データベースに新しいテーブルを作成するには、