Azure DevOps:プルリクエストの完了で TF401192
TF401192 は「プルリクエストが先へ進んでいる」ので完了を断る答えです。完了しようとしたページ・道具・スクリプトがプルリクエストを読んだ後に、ソース ブランチへ新しいコミットが入っています。Azure DevOps は、完了する人が見ていないかもしれないコミットをマージする代わりに、HTTP 409 Conflict で答えます。何もマージされていないので、プルリクエストを読み直し、新しいコミットを見てから、もう一度完了します。
答え
完了は、プルリクエストへの PATCH に "status": "completed" と lastMergeSourceCommit(呼ぶ側が読んだソースのコミット)を付けたものです。そのコミットがもうソース ブランチの先頭でないと、Azure DevOps は次のように答えます:
HTTP/1.1 409 Conflict
{"message":"TF401192: …","typeKey":"GitPullRequestStaleException", …}
2026年の公開の報告に出ています。Azure DevOps のプルリクエストを完了する道具4つが、9月と10月に本物のリポジトリでわざと古いソースのコミットを送り、409 TF401192 を受けました。試験用のリポジトリを作る道具は1月に、ソース ブランチを force push してすぐ完了して、これを受けました。「TF401192:」の後の英文は報告ごとに違うので、ここでは引いていません。
ここでは再現していません。状態コード・番号・typeKey は、それぞれの報告によります。Azure DevOps Server では確かめていません。
新しいコミットはどこから来るか
- レビューしている間に誰かが push した:同僚、コードを整形したり版を上げたりするパイプライン、別の clone からの自分。どれもプルリクエストを開いた後です。
- スクリプトが push してすぐ完了した:上の、試験用のリポジトリを作る道具は force push してから完了していました。いまは TF401192 を受けるとプルリクエストを読み直して、やり直しています。
- Azure CLI:
az repos pr update --id <id> --status completedはプルリクエストを読み、そのlastMergeSourceCommitを完了に添えて送ります(CLI のソース コードを2026年10月29日に読みました)。その間に push があれば、同じように断られます。
どうするか
- Web で:プルリクエストを読み直します。新しい push は Updates のタブに、コミットは Commits にあります。それを見てから、もう一度 Complete を選びます。
- 承認が消えていたら:ブランチのポリシーで「新しい変更が push されたら投票をリセットする」ようにしてあると、完了はもう一度承認を待ちます。選べる設定はレビュアーの最小数にあります。
- スクリプトで:完了の直前に読み直したコミットではなく、レビューした(または試験した)コミットを送ります:
PATCH https://dev.azure.com/<組織>/<プロジェクト>/_apis/git/repositories/<リポジトリ>/pullrequests/<id>?api-version=7.1 {"status": "completed", "lastMergeSourceCommit": {"commitId": "<レビューしたコミット>"}, "completionOptions": {"mergeStrategy": "squash"}}409 と TF401192(かGitPullRequestStaleException)は「新しいコミットが入った」として扱い、何も考えずにやり直す失敗としては扱いません。プルリクエストを読み直して決めます。新しいコミットにレビューや新しいビルドが要るなら、そこで止めます。すぐにやり直すのは、ブランチにあるものを何でもマージするつもりのスクリプトだけです。
IntelliJ IDEA と Rider で Azure DevOps のプルリクエストを
Azure DevOps Pull Requests は、Lesstep が作っている JetBrains IDE(2024.1 以降)と Android Studio のプラグインです。組織・プロジェクト・リポジトリを git のリモートから読み、自分のレビューを待っているプルリクエストを IDE のツールウィンドウに並べます。Azure DevOps Services でも Azure DevOps Server でも使えます。投票・コメント・完了も IDE から離れずにできます。1.0.43 からは、完了は開いている版のプルリクエストをマージします(画面に出ている変更のソースのコミットを送ります)。Azure DevOps が TF401192 で断ったときは、そのコミットの時点で開いた後に新しいコミットが入ったことを出し、それを入れてプルリクエストを読み直すので、見てからもう一度完了できます。レビューの受け箱は無料、投票・コメント・完了・作成は Pro(30日間の無料試用つき)です。画面は日本語です。
Azure DevOps は Microsoft Corporation の商標、IntelliJ IDEA と Rider は JetBrains s.r.o. の商標です。このページは Microsoft・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:TF401181:もう完了か破棄されている · ブランチのポリシーに断られた完了 · TF401398:ソースかターゲットのブランチが無い · マージの種類 · English