今回は、Gitで使用する差分確認コマンドについて、特にgit diff origin/main..HEADとgit diff HEAD..origin/mainの違いを詳しく解説していきます。
前提条件の確認
まず、以下のような状態でGitコマンドを実行してみました。
PS C:\MyProject>git status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
この状態では、
- メインブランチにいる
- ローカルブランチはリモートの
origin/mainと同期している - コミットする変更がなく、作業ディレクトリはクリーンな状態
git diffコマンドの実行結果
続いて、以下の差分確認コマンドを実行。
git diff
git diff origin/main..HEAD
git diff HEAD..origin/main
これらはすべて空の出力を返しました。しかし、実際にはリモートに新しい変更がプッシュされていた場合、なぜ差分が表示されなかったのでしょうか?
重要なポイント:git fetchの必要性
どちらの差分確認コマンドを使用する場合でも、まずgit fetchの実行が必要です。
これは以下の理由によります。
origin/mainはローカルに保存されているリモートブランチの参照git fetchを実行しないと、この参照が古いままになってしまう- その結果、正確な差分が確認できない
正しい差分確認の手順
両方のコマンドで、以下の手順を踏むことが重要です。
- まずリモートの最新情報を取得:
git fetch origin
- その後で差分を確認:
# ローカルの変更を確認する場合
git diff origin/main..HEAD
# リモートの変更を確認する場合
git diff HEAD..origin/main
git diff origin/main..HEADとgit diff HEAD..origin/mainの違い
これら2つのコマンドは、比較の方向が異なります。必ずgit fetchを先に実行する。
git diff origin/main..HEAD
- リモート(origin/main) → ローカル(HEAD)への変更を表示
- 「リモートと比べて、ローカルで何が変更されたか」を確認できる
git diff HEAD..origin/main
- ローカル(HEAD) → リモート(origin/main)への変更を表示
- 「ローカルと比べて、リモートで何が変更されたか」を確認できる
具体例で理解する
例えば、ファイルの中身が以下の状態だとします。
- origin/main: “Hello”
- HEAD: “Hello World”
この場合(git fetch実行後):
# git diff origin/main..HEAD の結果:
+ World
(プラス記号で表示:ローカルで"World"が追加された)
# git diff HEAD..origin/main の結果:
- World
(マイナス記号で表示:ローカルから見るとリモートでは"World"が無い)
繰り返しますが、git diff HEAD..origin/main を実行して + と - が表示される場合、これは 差分の内容 を示しています。具体的には、HEAD(現在のブランチの最新コミット)と origin/main(リモートの main ブランチの最新コミット)の間の変更点を表示しています。
+ と - の意味
- (マイナス記号):
これは、HEAD には存在するが、origin/main には存在しない行を表します。
つまり、HEAD から削除された行や、origin/main にない変更が表示されます。
+ (プラス記号):
これは、origin/main には存在するが、HEAD には存在しない行を表します。
つまり、origin/main に追加された行や、HEAD にない変更が表示されます。
他の例
例えば、以下のような差分が表示された場合:
- console.log("Hello, world!");
+ console.log("Hello, Git!");
-の行:HEADにはconsole.log("Hello, world!");という行があるが、origin/mainにはない。+の行:origin/mainにはconsole.log("Hello, Git!");という行があるが、HEADにはない。
この場合、HEAD では "Hello, world!" が出力されていたが、origin/main では "Hello, Git!" に変更されていることがわかります。
要するに
-:HEADに存在するが、origin/mainにない行(削除または変更された行)。+:origin/mainに存在するが、HEADにない行(追加または変更された行)。
この差分を見ることで、現在のブランチとリモートの main ブランチの違いを確認できます。
実践的な使い方
- 自分のローカルでの作業内容を確認したい場合、
git fetch origin
git diff origin/main..HEAD
- 他の人がリモートにプッシュした変更を確認したい場合、
git fetch origin
git diff HEAD..origin/main
まとめ
先にgit fetchを実行する。
差分の方向性を意識してコマンドを使い分ける。
- ローカルの変更確認:
git diff origin/main..HEAD - リモートの変更確認:
git diff HEAD..origin/main
git statusの表示だけでは、リモートの最新状態は分からない。
これらの点を押さえておけば、より効率的にGitでの変更管理が行えるようになります!
以下のリンクでは、Git及びGitHubに関する記事をまとめています。Gitの基本操作やブランチ管理、GitHubでのリポジトリ管理、共同作業のコツなど。気になるトピックをクリックして、詳しい情報を確認してください。
- Gitの差分確認コマンドを徹底解説 – origin/mainとHEADの違いを理解する
- git diffコマンドの実践的な使い方と便利なオプション
- git push -u origin main
- ローカルでコミットしたものを取り消す方法
- 【GitHub】ディレクトリの移動及びディレクトリの名前変更(質疑応答)
- git branch -M mainの意味
- 【Git】ステージング(staging)とは?
- .gitignore ファイルの使用について
- git config –list コマンド
- git commit -m “コミットメッセージ”
- GitHubアップロード完全ガイド:初心者でも簡単にできる方法
- GitHubのPagesで始める無料ウェブサイトを公開する設定手順
- Gitブランチ確認:現在のブランチを知る5つの方法
- GitHubのディレクトリ管理:効率的なプロジェクト構造の作り方
- GitHubのファイル管理基本:効率的な操作方法
- GitHubリポジトリの作成と設定:初心者向けガイド


