はじめに
この実験では、ローカルの Git ブランチがリモートのブランチから分岐しているかどうかを確認する方法を学びます。これは、共同開発において基本的なスキルであり、プロジェクトの変更内容を最新の状態に保つために必要です。
まず、シミュレートされたリモートリポジトリから更新を取得し、git status を使用してローカルブランチがリモートブランチよりも遅れているかどうかを確認します。次に、git log を使用してローカルブランチとリモートブランチのコミットを比較する方法を探り、最後に git diff @{u} HEAD を使用して分岐を検証します。
Fetch を実行し、git status で分岐を確認する
このステップでは、リモートリポジトリにあってローカルにない変更があるかどうかを確認する方法を学びます。これは、他の人と共同開発する際や、他の場所で更新されるプロジェクトに取り組む際に重要です。
まず、いくつかの変更があるリモートリポジトリをシミュレートしましょう。実際のシナリオでは、これは GitHub や GitLab のようなプラットフォームにホストされているリポジトリです。この実験では、ローカルディレクトリを「リモート」として使用します。
まだプロジェクトディレクトリにいない場合は、戻ってください。
cd ~/project/my-time-machine
次に、シミュレートされたリモートから最新の変更を取得しましょう。git fetch コマンドを使用します。このコマンドは、リモートリポジトリからコミット、ファイル、参照をダウンロードしてローカルリポジトリに保存します。ただし、現在のブランチにマージすることはありません。
git fetch origin
新しい変更がない場合は、出力がほとんど表示されないことがあります。ただし、git fetch はローカルリポジトリ内のリモートブランチに関する情報を更新します。
次に、git status を使用して、ローカルブランチがリモートブランチよりも遅れているかどうかを確認します。git status コマンドは、リポジトリの現在の状態を確認するためのウィンドウです。このコマンドは、ステージングされたファイル、ステージングされていないファイル、追跡されていないファイルについて教えてくれます。また、現在のブランチとその上流ブランチの関係に関する情報も提供します。
git status コマンドを実行します。
git status
先ほど取得したリモートに変更があった場合、git status の出力は、ローカルブランチがリモートブランチよりも遅れていることを示します。出力は次のようになることがあります。
On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree clean
このメッセージは、ローカルの master ブランチが origin/master ブランチ(マスターブランチのリモートバージョン)より 1 つのコミット分遅れていることを示しています。また、ローカルブランチを更新するために git pull を使用することを提案しています。これについては、後の実験で説明します。
取得後の git status の出力を理解することは重要です。なぜなら、リモートリポジトリから新しい変更があるかどうかを、ローカルの作業に統合する前に知ることができるからです。これにより、潜在的な競合を防ぎ、プロジェクトの進捗状況を把握することができます。
git log を使ってコミットを比較する
前のステップでは、git status を使ってローカルブランチがリモートブランチより遅れているかどうかを確認しました。今度は、git log を使って、リモートブランチにあってローカルブランチにない実際のコミットを確認しましょう。
git log コマンドは非常に多機能です。様々な方法でコミット履歴を表示することができます。ローカルブランチ (HEAD) とリモート追跡ブランチ (origin/master) を比較するには、次の構文を使います。
git log HEAD..origin/master
~/project/my-time-machine ディレクトリにいることを確認してください。
cd ~/project/my-time-machine
では、ブランチを比較するために git log コマンドを実行しましょう。
git log HEAD..origin/master
origin/master に、ローカルの HEAD(現在はローカルの master ブランチを指しています)にないコミットがある場合、このコマンドはそれらのコミットを一覧表示します。出力には、origin/master に存在して現在のブランチには存在しない各コミットの詳細が表示されます。コミットハッシュ、作者、日付、コミットメッセージなどです。
たとえば、リモートに 1 つの新しいコミットがある場合、出力は次のようになるかもしれません。
commit abcdef1234567890abcdef1234567890abcdef (origin/master)
Author: Another User <another.user@example.com>
Date: Tue Aug 8 10:00:00 2023 +0000
Add a new feature
この出力は、リモートにあってローカルにないコミットを明確に示しています。HEAD..origin/master 構文は、Git に対して HEAD から到達できないが origin/master から到達できるコミットを表示するよう指示します。
このように git log を使うことは、ブランチ間の違いを理解し、ローカルブランチを更新した場合にどのような変更が加わるかを正確に把握するための強力なツールです。分岐の原因となっている特定のコミットに関して、git status よりも詳細な情報を提供します。
ログビューがページャで開いた場合は、q を押してビューを終了することを忘れないでください。
git diff @{u} HEAD で確認する
前のステップでは、git status を使ってローカルブランチがリモートブランチより遅れているかどうかを確認し、git log を使って異なるコミットを確認しました。今度は、git diff を使って、リモートブランチのコミットによって導入された実際のコードの変更を、ローカルブランチと比較して確認しましょう。
git diff コマンドは、Git 履歴内の 2 つのポイント間の差分を表示します。これを使って、現在のローカルブランチ (HEAD) とその上流ブランチを比較することができます。上流ブランチとは、ローカルブランチが追跡しているリモートリポジトリ上のブランチのことです。この場合、master の上流ブランチは origin/master です。Git は上流ブランチに便利な省略形 @{u} または @{upstream} を提供しています。
~/project/my-time-machine ディレクトリにいることを確認してください。
cd ~/project/my-time-machine
では、git diff コマンドを実行して、ローカルブランチとその上流ブランチの差分を確認しましょう。
git diff @{u} HEAD
このコマンドは、現在のコミット (HEAD) のファイルと上流ブランチの最新コミット (@{u}) のファイルとの間の行単位の差分を表示します。
まだプルしていないリモート上の変更がある場合、出力にはそれらの差分が表示されます。たとえば、リモート上の message.txt に行が追加された場合、出力は次のようになるかもしれません。
diff --git a/message.txt b/message.txt
index a1b2c3d..e4f5g6h 100644
--- a/message.txt
+++ b/message.txt
@@ -1 +1,2 @@
Hello, Future Me
+This is a new line from the remote.
+ 記号は、上流ブランチ (@{u}) にはあるが、ローカルブランチ (HEAD) にはない行を示しています。
git diff @{u} HEAD を使うことは、リモート上に存在する変更をローカルブランチにマージする前にプレビューする強力な方法です。行われた正確な変更を理解することができ、コードレビューや単にプロジェクトの進化を把握するのに非常に役立ちます。
差分ビューがページャで開いた場合は、q を押してビューを終了してください。
まとめ
この実験では、ローカルの Git ブランチがリモートブランチから分岐しているかどうかを確認する方法を学びました。まず、リモートリポジトリをシミュレートし、git fetch を使って最新の変更を取得しましたが、それらをマージすることはありませんでした。その後、git status を使って、ローカルブランチがリモートブランチより遅れているかどうかを迅速に確認しました。これは、「Your branch is behind 'origin/master' by X commit」のようなメッセージで示されます。
git status での初期チェックの後、ブランチを比較するより詳細な方法を調べました。様々なオプションを使って git log を使用し、コミット履歴を可視化し、ローカルブランチとリモートブランチの違いを特定する方法を学びました。最後に、git diff @{u} HEAD を使って、上流ブランチと現在の HEAD の間の変更を正確に比較する方法を発見し、分岐の状況を明確に把握することができました。



