Bitbucket のプルリクのマージの衝突
プルリクエストの元ブランチと宛先ブランチが同じ行を別々に変えていたり、片方が変えたファイルをもう片方が消していたりすると、Bitbucket は衝突(コンフリクト)を解消するまでプルリクをマージできません。しかも Bitbucket の Web の画面には直すための編集画面がなく、解消はリポジトリのクローンで行ってプッシュします。以下は Bitbucket に何が出て、どうすればよいかを、Atlassian の Resolve merge conflicts(Cloud)・Merge a pull request(Data Center 10.5)・REST の資料(いずれも英語)からまとめたものです。
Bitbucket に出るもの
- Bitbucket Cloud:衝突があるあいだは、プルリクのマージボタンを押せません。マージしようとすると衝突があると知らせます。
- Bitbucket Data Center:マージを止める衝突は、プルリクの概要(Overview)と差分(Diff)のタブに出て、More information で手元のリポジトリでの解消のしかたが読めます。マージボタンは、衝突がなければプルリクを作った時から押せます。
- 自動マージ(Data Center)は衝突のないプルリクにしか設定できず、プルリクに衝突が出ると Bitbucket は自動マージを取り消します。
手元で解消する
Atlassian の Bitbucket Cloud 向けの手順です。元ブランチが feature、宛先が main で、同じリポジトリにある場合:
git checkout feature
git pull origin main
# Git が main を feature にマージし、衝突で止まる
# 衝突したファイルを直す:印を消して、残すべき内容にする
git add <ファイル>
git commit -m "Merge main into feature"
git push origin feature
- プッシュのあとも、プルリクは開いたままで、衝突は出なくなります。
- 衝突したファイルの中では、
<<<<<<<と=======の間が今いるブランチの内容、=======と>>>>>>>の間が取り込んだブランチの内容です。 - フォークから:Atlassian のページは、元のリポジトリのブランチをフォークのブランチへ同じように pull しています。代わりに元のリポジトリで衝突を解消すると、プッシュした時点でプルリクがマージされる、とも注意しています。
featureをmainの上にリベースしても解消できますが、ブランチのコミットが書き換わるので、プッシュは置き換え(git push --force-with-lease)になり、ブランチの制限で禁じられていることがあります。
REST API から
- Bitbucket Cloud の
GET …/pullrequests/{id}/mergeability/checks:git_mergeability_checkのreasonがclean・conflicts・merge_impossibleのどれかです。状態がUNKNOWNの時は付かず、Atlassian はそれが「衝突がない」という意味ではないと書いています。マージを止めている時は、links.detailsがプルリクの conflicts の API を指します。 - 衝突しているファイル(Cloud):
GET …/pullrequests/{id}/conflictsは…/file-conflicts/{spec}へ転送し、path・scenario・messageの一覧を返します。たとえばcontentと "File modified in both source and destination"(両方で変更されたファイル)、ほかにdelete_modify・binary・rename_delete・directory_fileなど。 - 以前のやり方だった diff や diffstat の
?merge=trueは無くなりました。Bitbucket Cloud の2026年8月24日の変更履歴によると、2022年から非推奨だったこの引数は、2026年9月4日で削除されています。 - Bitbucket Data Center の
GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/merge(Test if pull request can be merged):conflicted(true か false)、outcome(CLEAN・CONFLICTED・UNKNOWN)、マージチェックのvetoes。
IntelliJ IDEA でマージの衝突を解消する
Pull Request Inbox for Bitbucket は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。Bitbucket Cloud と、ベータとして Bitbucket Data Center 8.9 以降の、あなたのレビューを待つプルリクエストを IDE のツールウィンドウに並べます。1.0.42 から、マージの衝突があるプルリクは概要のいちばん上にそう出て、IDE で解消するを押すと、fetch して元ブランチをチェックアウトし、宛先ブランチをそこへマージします。衝突したファイルは IDE のマージの画面(自分の変更を採用・相手の変更を採用・左右に並べてマージ)で開きます。1.0.43 からは、衝突しているファイルと、それぞれで何がぶつかっているかも概要に並びます(Cloud は上の conflicts の API から、Data Center はプルリクの変更一覧に付く衝突の印から読みます)。マージをコミットしてブランチをプッシュすれば、プルリクをマージできるようになります。衝突の解消は無料で、レビューの受信箱・差分・ディスカッション・マージチェックも無料、承認・コメント・マージは Pro(月 US$1.50、30日間の無料試用つき)です。画面は日本語です。
Bitbucket と Atlassian は Atlassian の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは Atlassian・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:Bitbucket のマージチェック · Bitbucket のマージ方法 · Bitbucket の自動マージ · IntelliJ IDEA で使える Bitbucket のプルリクエストのプラグインの比較 · English