Azure DevOps のマージの種類:スカッシュ・リベース・半線形と Limit merge types
プルリクエストを完了する時の Merge type(マージの種類)で、ターゲット ブランチに何が入るかが決まります。Azure Repos には4つあり、ブランチ ポリシーの Limit merge types でその一部だけを許せます。許されていない種類で完了しようとすると、Azure DevOps に断られます。以下は Microsoft の プルリクエストの完了とブランチ ポリシーのページから、それぞれの働きと制限のもとをまとめたものです。
4つのマージの種類
- Merge (no fast forward):ターゲットとソースのブランチを親に持つマージ コミット。履歴は一直線にならず、コミットはすべて残ります。
- Squash commit:変更をまとめた新しいコミットを1つ、ターゲットに作ります。ソース ブランチのコミットは残らず、新しいコミットはブランチを指さないので、Microsoft はスカッシュの後にソース ブランチを消すよう勧めています(マージ戦略とスカッシュ マージ)。
- Rebase and fast-forward:ソースのコミットをターゲットの上に積み直し、マージ コミットは作りません。
- Semi-linear merge:ソースのコミットをターゲットの上に積み直してから、親が2つのマージ コミットを足します。rebase and merge とも呼ばれ、ポリシーの画面では「Rebase with merge commit」です。
リベースして早送りと半線形マージは 2019年に入りました(Sprint 150)。それまではマージ コミットとスカッシュだけでした。Azure DevOps Server では Server 2019 Update 1 から新しい2つを受け付け、TFS 2018 と Update なしの Server 2019 はマージかスカッシュだけです。
Limit merge types
- 何も設定しなければ、すべての種類が許されます。ブランチのポリシーで Limit merge types をオンにし、残す種類にチェックします:Basic merge (no fast-forward)・Squash merge・Rebase and fast-forward・Rebase with merge commit。
- 古いポリシーは「スカッシュのみ」の形で、今も効いています。そのブランチでほかの種類を使うには、ポリシーを編集します(Sprint 150 と、プルリクエストの完了のページの注記)。
- コマンドラインでは
az repos policy merge-strategy createに--allow-no-fast-forward・--allow-squash・--allow-rebase・--allow-rebase-mergeを渡します。古い--use-squash-merge(常にスカッシュ)は非推奨です。 - ブランチ ポリシーを無視できる権限がある人には、完了の画面に Override branch policies and enable merge が出て、そのまま完了できます。
よくあるつまずき
- 使いたい種類が無い、または完了が断られる:ターゲット ブランチがマージの種類を制限しています。許されている種類を選ぶか、ブランチのポリシーを編集できる人に頼みます。
- リベースできない(Sprint 150):ターゲット ブランチのポリシーがリベースの種類を禁じている時(ブランチ ポリシーを無視できる権限が要る)、ソース ブランチに自分のポリシーがある時(リベースがポリシーを通さずにソースを変えてしまう)、Merge Conflicts 拡張で競合を解いた後。手元でリベースしてプッシュするか、スカッシュします。
- az repos で選べるのはスカッシュするかどうかだけ:
az repos pr updateとaz repos pr createの完了のオプションには--squashがあり、リベースの種類はありません。REST API のcompletionOptions.mergeStrategyなら4つとも指定できます。 - スカッシュの後、ブランチがマージされていないように見える:ブランチのコミットはターゲットに入らないので、Git はマージ済みと見なしません。完了の時に消しておきます。
マージ コミットのメッセージ
- 「Complete pull request」の画面の完了後のオプション Customize merge commit message で、マージ コミットのメッセージを自分で書けます(Complete a pull request)。Microsoft は、マージの種類によっては出ないオプションがあると書いています。リベースして早送りでは、マージ コミット自体ができません。
- コマンドラインでは、
az repos pr updateとaz repos pr createの完了のオプションに--squashと並んで--merge-commit-messageがあります。 - REST API では
completionOptions.mergeCommitMessageで、4.1 から載っています。説明は「設定すると、マージ コミットのメッセージとして使う」(Pull Requests - Update)。その例は自動完了と一緒に設定しているので、自動で完了するプルリクエストにもメッセージを渡せます。
IntelliJ IDEA でのマージの種類
Azure DevOps Pull Requests は、Lesstep が作っている JetBrains IDE(2024.1 以降)と Android Studio のプラグインです。Azure DevOps Services と Azure DevOps Server のプルリクエストを IDE のツールウィンドウに並べます。完了の画面には4つのマージの種類があり(TFS 2018 と Update 1 より前の Server 2019 ではマージかスカッシュ)、1.0.53 からはターゲット ブランチが許す種類だけが出て、ブランチ ポリシーの欄にも許される種類の名前が出ます。選んだ種類で自動完了も設定できます。1.0.68 からは、完了の画面でマージ コミットのメッセージも書けます(すぐの完了にも自動完了にも使う。空のままなら Azure DevOps の既定のメッセージ。リベースして早送りでは書けません)。レビューの受け箱とブランチ ポリシーは無料、投票・コメント・完了・プルリクエストの作成は Pro(30日間の無料試用つき)です。画面は日本語です。
Azure DevOps は Microsoft Corporation の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは Microsoft・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:マージ競合と Merge Conflict Extension · 自動完了と任意のポリシー · 必須のレビュー担当者とパスの絞り込み · ポリシーを回避する明示的なオーバーライド · 承認が「最低レビュー担当者数」に数えられない理由 · IntelliJ IDEA で使える Azure DevOps のプルリクエストのプラグインの比較 · English