GitHubでPRを作ろうとしたら「Files changed 0」になった時の原因調査と対処法(Git)
GitHub上でプルリクエスト(PR)を作成しようとした際に、「Files changed(変更ファイル)」が0件になったり、**「There isn’t anything to compare」**と言われてPRが作成できないことはありませんか?
このドキュメントでは、差分が出ないときの原因調査フローと状況別の解決手順をまとめます。
(※コマンド例は標準的なGitコマンドなので、基本は PowerShell / Bash どちらでも同様に実行可能です)
1. 結論:PR差分が0件になる主な原因
PRの差分が表示されない場合、原因の多くは以下のいずれかです。
- base(マージ先)と compare(マージ元)が 同じコミットを指している
- compare ブランチが base よりも 古い(behind)
- すでにマージ済み(変更が取り込み済み)
- revert によって変更が打ち消された履歴がある
NOTE(Revertの罠)
一度マージした後にgit revertで変更を打ち消した場合、「過去にマージした事実(コミット履歴)」自体は残ります。
そのため、再度同じブランチをマージしようとしてもGitは「すでに取り込み済み」と判断し、差分が0件に見えることがあります。
2. まずやる調査(Gitコマンドで事実確認)
GUIだけで悩まず、CLIで現状を正確に把握するのが解決への近道です。
2.1 ブランチとリモートの最新化
まず情報を最新にします。
git status -sb
git remote -v
git fetch --all --prune
2.2 先端コミットの確認
マージ先(例: develop)とマージ元(例: feature/...)がどこにいるか確認します。
# マージ先 (base)
git show -s --oneline --decorate origin/develop
# マージ元 (compare)
git show -s --oneline --decorate "origin/feature/add-new-feature"
2.3 ahead/behind を数値で確認【最重要】
どっちがどれだけ進んでいるか(または遅れているか)を数値で出します。
# 構文: git rev-list --left-right --count <base>...<compare>
git rev-list --left-right --count origin/develop..."origin/feature/add-new-feature"
出力結果の見方(例: 5 0 の場合)
-
左の数値:
develop側にしかないコミット数 -
右の数値:
feature側にしかないコミット数
| パターン | 判定 |
|---|---|
右が 0
|
feature 側に新しいコミットがありません。PR差分は出ません。 |
左が大きく、右が 0
|
feature が develop より古いです(behind)。develop から派生し直すか、rebase/merge が必要です。 |
| 両方に数値あり | 正常です。差分が出るはずです(※コンフリクトの可能性はあります)。 |
2.4 履歴の可視化
グラフ構造を見て、マージや revert の線を確認します。
git log --oneline --decorate --graph --all -n 30
3. 状況別の解決策
3.1 PRの base / compare 選択ミス
GitHub画面で逆に選択していることがあります。
-
base:マージ先(変更を取り込む親。例:
develop) -
compare:マージ元(変更した作業ブランチ。例:
feature/...)
3.2 「develop を main/master から作ったはずなのに差分0」問題
原因:develop ブランチを作成する際、誤って古いブランチから派生させた/ローカルの develop が汚れていた可能性があります。
対処:ローカルの develop を正しく作り直して強制同期します。
※注意:チームで develop を共有している場合、force push は他メンバーに影響するため、合意の上で行ってください。
# master(main) を正として develop を再作成する例(環境に合わせて master/main を読み替え)
git checkout master
git pull origin master
git branch -D develop
git checkout -b develop
# 注意して実行
git push -f origin develop
3.3 「過去にマージ済み」なのでPR差分が0
原因:その変更はすでに base に取り込まれています。GitはコミットIDで履歴を管理しているため、同じコミットを再度PRしても差分は出ません。
対処法:
- 機能追加が必要なら、**新しいコミット(変更)**を積む
- どうしても同じ内容を再適用したいなら、revert の revert や cherry-pick を行う(後述)
3.4 「revert された変更を“そのまま復活”させたい」
一度マージしたが不具合などで revert(取り消し)し、修正して再度出したい場合などが該当します。
方法:revertコミットをさらに revert する(revert の revert)
base側(例:develop)に「打ち消しコミット」が存在する場合、その打ち消しをさらに打ち消すことで変更を復活させます。
# baseに合わせてブランチ作成
git checkout develop
git pull origin develop
git checkout -b reapply-feature-onto-develop
# <revert_commit_hash> は git log で確認した「打ち消しコミット」のハッシュ
git revert <revert_commit_hash>
# PushしてPR作成
git push -u origin HEAD
GitHubで base: develop / compare: reapply-feature-onto-develop でPRを作成します。
3.5 「revertコミットが入っていない別ブランチに入れたい」
履歴が複雑な場合や、revert履歴のない別のリリースブランチに入れたい場合は cherry-pick が確実です。
# ターゲットブランチへ移動
git checkout <target_branch>
git pull origin <target_branch>
# 作業用ブランチ作成
git checkout -b port-feature-onto-<target>
# 必要なコミットだけをつまみ食い(適用)
git cherry-pick <commit_hash>
# PushしてPR
git push -u origin HEAD
4. 補足:Push時に「src refspec ... does not match any」が出る場合
代表的なエラー:
error: src refspec ... does not match any
主な原因は以下の2つです。
- ローカルにそのブランチ名が存在しない(タイプミス含む)
- コミットが一つもなく、ブランチの実体が作られていない
解決策:
# 現在のブランチ名を再確認
git branch
# ブランチ名を指定せず、今いるブランチを確実にPushする(推奨)
git push -u origin HEAD
# ブランチ名を明示してPushする
git push -u origin <正しいブランチ名>
5. 迷ったときの「判断フロー」簡易版
- 実行:
git rev-list --left-right --count base...compare
- 判定:
-
右側の数値が
0→ compare側に新しい変更がありません。PR差分は出ません。
- 理由の特定と対策:
- 既にマージ済み/revert済みで「復活」したい → revert の revert
- 特定の変更だけ適用したい → cherry-pick
- Pushで詰まったら →
git push -u origin HEADを試す