はじめに (対象読者・この記事でわかること)

この記事は、Azure DevOps を使った開発を行っているが、Pull Request (PR) を作成しようとした際に「ブランチに差分がないためマージできません」といったメッセージが表示され、PR が作成できない・マージできない問題に困っている方を対象としています。

この記事を読むことで、Azure DevOps での PR 作成時に「差分がない」と判定される主な原因と、それらを解消するための具体的な手順がわかります。また、今後同様の問題を防ぐための運用方法についても学ぶことができます。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - Git の基本的なコマンド操作(ブランチ作成、コミット、プッシュ) - Azure DevOps の基本的な使い方(リポジトリ、ブランチ、Pull Request の概念)

Azure DevOps で「差分がない」と表示されるのはなぜ?

Azure DevOps で Pull Request を作成する際、対象のブランチ(例: feature/xxx)と、マージ先のブランチ(通常は maindevelop)との間に差分が存在しないと、PR を作成できない・マージできないという現象が起こります。

これは、Git の仕組み上、当然の挙動です。PR は「ブランチ間の差分をレビューしてからマージする」ための機能であり、差分がなければ「レビューすべきものがない」ため、PR の作成自体が許可されていないのです。

しかし、「ローカルでは差分があるはずなのに、Azure DevOps 上で PR を作成しようとすると差分がないと言われる」というケースがよくあります。これには主に以下のような原因が考えられます。

  1. ブランチの push 忘れ: ローカルでコミットしたが、リモートリポジトリに push していない。
  2. ブランチの作成元が古い: ブランチを作成した時点の親ブランチが、現在の親ブランチよりも古い状態である。
  3. マージ先ブランチが更新されている: PR を作成しようとしたタイミングで、他の人がマージ先ブランチに新しいコミットをプッシュしている。
  4. ブランチポリシーの制限: Azure DevOps のブランチポリシーによって、特定の条件下でのみ PR が作成可能になっている。

原因を特定し、Pull Request を正常に作成するまでの手順

ここからは、実際に「差分がない」と表示されてしまった場合の、原因特定と解決方法を具体的に解説します。

ステップ1: ローカルのブランチとリモトのブランチを同期する

まず、ローカルの作業ブランチが、リモートリポジトリの最新の状態を反映しているか確認しましょう。

Bash
# 1. 現在のブランチを確認 git status # On branch feature/xxx # nothing to commit, working tree clean # 2. リモートリポジトリの最新情報を取得 git fetch origin # 3. マージ先ブランチ(例: main)にいる場合は、最新に更新 git checkout main git pull origin main # 4. 作業ブランチに戻り、マージ先ブランチの変更を取り込む git checkout feature/xxx git rebase origin/main # または git merge origin/main # 5. 作業ブランチをリモートにプッシュ(--force-with-lease は rebase 後に必須) git push origin feature/xxx --force-with-lease

この手順を実行後、再度 Azure DevOps 上で PR を作成してみてください。多くの場合、差分が認識されるようになります。

ステップ2: ブランチの差分をローカルで正確に確認する

ローカル環境で、対象のブランチとマージ先ブランチとの差分が正確に存在するかを確認しましょう。

Bash
# 1. マージ先ブランチ(例: main)との差分を確認 git diff main...feature/xxx # 2. 差分があるファイルの一覧を表示 git diff --name-only main...feature/xxx # 3. 差分がない場合は、コミットが存在するか確認 git log main...feature/xxx --oneline

上記のコマンドで、差分やコミットが存在しない場合、以下の可能性があります。

  • ブランチの作成元が、現在のマージ先ブランチと同じか、それよりも古い状態で、まだ新しいコミットを作成していない。
  • すでに別のブランチや PR で、同じ変更がマージ先ブランチに取り込まれている。

ステップ3: Azure DevOps のブランチポリシーを確認する

Azure DevOps では、ブランチポリシーという機能を使って、PR の作成条件を細かく制限できます。

Azure DevOps のプロジェクトページから、対象のリポジトリ → 「ブランチ」 → マージ先のブランチ(例: main)の 「…」 メニュー → 「ブランチポリシー」を選択し、以下のポイントを確認しましょう。

  • 要求されたレビューアー: 特定のメンバーの承認が必須になっていないか。
  • チェック: 自動ビルドやテストの成否が条件になっていないか。
  • コミットの必須化: 特定の形式のコミットメッセージが必須になっていないか。

これらのポリシーによっては、PR の作成自体が制限されることがあります。

ハマった点やエラー解決

筆者が実際に経験した、「明らかに差分があるはずなのに Azure DevOps で差分なしと言われる」ケースを紹介します。

ケース:
feature/xxx ブランチで新しいファイル newfile.txt を作成・コミット・プッシュしたにも関わらず、Azure DevOps で PR を作成しようとすると「ブランチに差分がないためマージできません」と表示される。

原因:
feature/xxx ブランチを作成した時点の main ブランチが、リモート上の最新の main ブランチよりも古い状態であった。つまり、ローカルで git checkout -b feature/xxx してから、他のメンバーが main に複数のコミットをプッシュしていたため、Azure DevOps 上では feature/xxx の祖先が、現在の main よりも古く、差分がないと判定されてしまっていた。

解決策

この問題を解決するには、以下の手順でブランチを最新の状態に更新します。

Bash
# 1. マージ先ブランチを最新にする git checkout main git pull origin main # 2. 作業ブランチに戻る git checkout feature/xxx # 3. マージ先ブランチの変更を取り込む(rebase または merge) git rebase main # または git merge main # 4. コンフリクトが発生した場合は解消して、rebase --continue または commit # 5. リモートに強制プッシュ(rebase 後は必須) git push origin feature/xxx --force-with-lease

この操作により、作業ブランチが最新のマージ先ブランチを基準にして差分を持つようになり、Azure DevOps でも正常に PR を作成できるようになります。

まとめ

本記事では、Azure DevOps で Pull Request を作成しようとした際に「ブランチに差分がないためマージできません」と表示されてしまう問題の主な原因と、それらを解決するための具体的な手順を解説しました。

  • 原因の大半は、ブランチの同期不足: ローカルやリモートのブランチが最新でないことがほとんど。
  • 正しいブランチ更新手順: git fetchgit rebase(または merge)→ git push --force-with-lease の流れが重要。
  • ブランチポリシーの確認: Azure DevOps のブランチポリシーによっても PR 作成が制限されることがある。

この記事を通して、Azure DevOps でのブランチ運用がよりスムーズになり、チーム開発の効率が向上することを願っています。

今後は、Azure DevOps のブランチポリシーの詳細設定や、複数人での並行開発時のベストプラクティスについても記事にする予定です。

参考資料