Azure DevOps でプルリクを完了してもソース ブランチが消えない
Azure DevOps がプルリクエストのソース ブランチを完了と一緒に消すのは、そう指定したときだけです。消すときの決まりは、ふつうにブランチを削除するときと同じです。ブランチが残るのは、たいてい次のどれかです。削除の指定が無かった、そのブランチの Force push の権限が無い、ブランチに必須のポリシーがある、既定のブランチかロック中、あるいは Azure DevOps からは消えていて手元の Git にだけ残っている。以下は Microsoft の pull request を完了、破棄、または元に戻す、Git ブランチの削除、Git ブランチのセキュリティとアクセス許可を設定するをもとにしています。
完了のときに指定する
- Web の画面:完了の画面の、完了後のオプションに Delete <ブランチ名> after merging(マージ後にブランチを削除)があります。リンクした作業項目を完了するオプションの隣です。自動完了では、自動完了を設定するときに選び、後で Azure DevOps が完了するときにそのとおり行われます。
- Azure CLI:
az repos pr update --id 21 --status completed --delete-source-branch true。--auto-complete trueと一緒にも付けられます(az repos pr)。 - REST API:
completionOptions.deleteSourceBranch。説明は「true なら、完了の後にソース ブランチを削除する」です(Pull Requests - Update・英語)。これを付けずに完了するスクリプトでは、ブランチは残ります。
PATCH https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests/21?api-version=7.1
{
"status": "completed",
"lastMergeSourceCommit": { "commitId": "<レビューしたときのソース ブランチの先頭>" },
"completionOptions": { "deleteSourceBranch": true, "mergeStrategy": "squash" }
}
その先頭を読んだ後にソース ブランチへ新しいコミットが入っていると、Azure DevOps は TF401192 で完了を断ります。マージも削除も行われません。
ブランチを消せなくなる条件
Microsoft の「Git ブランチの削除」は、リモートのブランチを消す前に要るものを挙げています。Web の画面でも Visual Studio でもコマンドでも同じです。
- Force push:ブランチ単位の権限 Force push (rewrite history, delete branches and tags) が「許可」になっていること。この権限の説明にも、ブランチの削除に必要だと書かれています。ブランチを作った人には、そのブランチでこの権限が最初から付きます。Microsoft によれば、ほとんどのブランチは1人が使う短命のもので、プルリクのマージ後にブランチを消すのに管理者の手を借りずに済むようにするためです。同僚のプルリクを完了した人は、そのブランチでこの権限を持っていないことがあります。リポジトリ単位では、既定でこの権限を持つセキュリティ グループはありません。
- 必須のブランチ ポリシー:先にすべて無効にするか外す必要があり、それには「ポリシーの編集」の権限が要ります。main にマージした release ブランチのように、ソース ブランチ自体が守られていると残ります。
- 既定のブランチは、別のブランチを既定にするまで消せません。
- ロック中のブランチは、先にロックを外します。ほかの人のロックを外すには「他ユーザーのロックの削除」の権限が要ります。
確かめる順番
- Azure DevOps から消えているか:Repos > Branches を見ます。そこに無ければ、手元の Git にリモート追跡の写しが残っているだけです。
git fetch --pruneで、サーバーに無くなったブランチの写しが消えます。 - 削除を指定したか:完了したプルリクの REST API の
completionOptionsに、完了したときの指定が残っています。 - 上の4つの条件:Microsoft は、「ブランチの削除」が出ないときは、実際に効いている Force push の権限と、必須のポリシー・既定のブランチ・ロックのどれにも当たらないことを確かめるよう書いています。
- 手で消す:Repos > Branches でそのブランチの「その他のオプション」から「ブランチの削除」を選ぶか、
git push origin --delete feature/login。どちらも、そのブランチで Force push を持つ人が行います。
IntelliJ IDEA と Rider で
Azure DevOps Pull Requests は、Lesstep が作っている JetBrains IDE(2024.1 以降)と Android Studio のプラグインです。Azure DevOps Services と Azure DevOps Server のプルリクエストを IDE のツールウィンドウに並べます。完了の画面に「マージ後に {ブランチ} を削除」があり、最初の状態は一度決めておく設定(完了後にソース ブランチを削除)に従います。完了でも自動完了でも毎回 deleteSourceBranch を送るので、既定の値まかせになりません。完了は画面に出したソースのコミットで行うため、見ていない新しいコミットはマージされません。ブランチを消せるかどうかは、上の4つの条件で Azure DevOps が決めます。完了は有料の機能で、30日間の無料試用があります。レビューの一覧・差分・ブランチ ポリシーを見るのは無料のままです。
Azure DevOps は Microsoft Corporation の商標、IntelliJ IDEA と Rider は JetBrains s.r.o. の商標です。このページは Microsoft・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:マージ方法 · 自動完了 · TF402455 · Bitbucket の場合 · English