Lesstep
Azure DevOps Services・Server・プルリク・2026年11月2日

Azure DevOps のプルリクを元に戻す・cherry-pick する

Azure Repos には、プルリクの変更を使い回すボタンが2つあります。「元に戻す」(Revert)は変更を取り消し、「Cherry-pick」は変更を別のブランチに写します(リリースのブランチへの修正など)。どちらもブランチを直接は変えません。新しいトピックブランチを作り、そこから新しいプルリクを開くよう求めるので、いつものレビューとブランチ ポリシーがそのまま効きます。以下は、その手順、REST の呼び方、Azure でできないときのやり方です。もとにしたのは Microsoft の pull request を完了、破棄、または元に戻す、チェリーピックで変更をコピーすると REST のリファレンスです。

完了したプルリクを元に戻す

完了したプルリクを開き、「元に戻す」を選びます。「Pull request を元に戻す」の画面で、変更を取り消したいブランチを「ターゲット ブランチ」で選び、必要なら「トピック ブランチ名」を変えて、「元に戻す」を押します。「新しい pull request」の画面で「作成」を押し、そのプルリクを完了すれば取り消しが終わります。

新しいブランチには、元のプルリクのファイルの変更をすべて取り消すコミットが1つだけ入ります。元のコミットを1つずつ取り消すわけではありません。

別のブランチへ cherry-pick する

完了したプルリクなら「概要」ページに、アクティブなプルリクなら「その他のオプション」のメニューに Cherry-pick があります。Azure は新しいトピックブランチを作り、プルリクの変更をすべてそこへ cherry-pick して、選んだブランチへのプルリクを作るよう求めます。Microsoft はこれを、ターゲットのブランチに修正を当てるための限られた機能と書いています。コミット1つだけなど細かく選びたいときは、下の git を使います。

REST API で

どちらも裏で動く処理です。プルリクを元にして、当てる先のブランチ(ontoRefName)と新しいブランチの名前(generatedRefName)を付けて始めます。

POST https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repository}/reverts?api-version=7.1
{"source": {"pullRequestId": 21},
 "ontoRefName": "refs/heads/main",
 "generatedRefName": "refs/heads/revert-pr-21"}

cherry-pick なら、同じ中身を .../cherryPicks?api-version=7.1 に送り、ontoRefName を写したい先のブランチにします。答えには id と、queued か inProgress の状態が入っています。.../reverts/{id}(または .../cherryPicks/{id})を、completed か failed になるまで読み、できたブランチからプルリクを開きます(CLI なら az repos pr create)。

失敗したときは detailedStatus に理由があります。変更がきれいに当たらなかったら conflict が true、時間がかかりすぎたら timedout が true で、failureMessage に文があります。ほかの理由は status のコードで、たとえば createBranchPermissionRequired(ブランチを作る権限がない)、refNameConflict(大文字と小文字だけが違う同じ名前のブランチがある)、invalidRefName、targetBranchDeleted です。

Azure でできないとき:手元の git で

衝突は手で解くしかありません。ターゲットからブランチを作り、完了のときにそこへできたコミットを revert か cherry-pick して、ブランチをプッシュします。

git fetch origin
git switch -c revert-pr-21 origin/main
git revert -m 1 <merge commit>     # Merge か Semi-linear merge で完了したとき
git revert <squash commit>         # Squash commit で完了したとき
git push -u origin revert-pr-21

マージのコミットには親が2つあり、-m 1 はターゲットのブランチの側を残す指定です(git revert)。Rebase and fast-forward で完了したプルリクは、コミットがターゲットに1つずつ並んでいるので、そのコミットを revert します。cherry-pick なら、写す先のブランチから作ったブランチで git cherry-pick を同じように使います。完了の種類ごとの違いはマージ方法にあります。

取り消した変更を戻したいとき

Merge(早送りなし)で完了したプルリクを元に戻した後、元のソースブランチから新しいプルリクを開いても、変更は戻りません。そのコミットはもうターゲットのブランチの履歴に入っているので、git はマージするものが無いと見ます。git の文書も、マージを取り消したときの同じ動きを書いています。戻すときは、取り消しのプルリク(完了済み)で「元に戻す」を選び、取り消しを取り消します。

IntelliJ IDEA と Rider で

Azure DevOps Pull Requests は、Lesstep が作っている JetBrains IDE(2024.1 以降)と Android Studio のプラグインです。Azure DevOps Services と Azure DevOps Server のプルリクエストを IDE のツールウィンドウに並べます。「元に戻す」と Cherry-pick は Web の画面のボタンで、プラグインにはありません。git で行うときは、IDE の Git のログに Revert Commit と Cherry-Pick があり(JetBrains の説明・英語)、ブランチをプッシュした後はプラグインからプルリクを作れます。リポジトリのテンプレートが入り、レビュアーは最近のプルリクの顔ぶれから選べます。プルリクの作成は有料の機能で、30日間の無料試用があります。読むのは無料のままです。

JetBrains Marketplace で入れる

Azure DevOps は Microsoft Corporation の商標、IntelliJ IDEA と Rider は JetBrains s.r.o. の商標です。このページは Microsoft・JetBrains のいずれとも提携しておらず、承認も受けていません。

ほかに:マージ方法 · 破棄と再アクティブ化 · ターゲットブランチを変える · マージの衝突 · English