Mastodon 1.4.1がリリースされたのでアップデートするべく
$ git merge v1.4.1
...(中略)...
Automatic merge failed; fix conflicts and then commit the results.
アイエエエエ!!!!コンフリクト!?コンフリクトナンデ!?
状況
本家リポジトリをfork/cloneして自分用のブランチを切ってHEADにしていたが、いまのところ特に変更はしていないのでHEAD = v1.3.3
だった。
何も考えずにfast-forwardを期待してmergeを実行したらコンフリクトして頭を抱えた。
(ブランチを切らずにgit checkout v1.4.1
でアップデートする運用の場合にはこの問題は発生しないはず)
解決編
とりあえず
$ git merge --abort
で元に戻る。
で、v1.4.1
をマージする代わりに
$ git merge 5439a81
とすれば多分良い(試していないので本当にちゃんと動くかはわからない)。これはv1.3.3
の属するブランチ(skylight
)にv1.4.1
時点のmaster
をマージしたコミットで、丁度さっきやろうとしたマージのコンフリクトを解決させたコミットということになる。(なおdiff取ってみるとv1.4.1
と微妙に違いがあるようだ)
これは執筆(2017年6月3日)時点ではskylight
ブランチの最新コミットなので、
$ git merge <remote>/skylight
でもよい。(<remote>
は各自の設定によりorigin
なりupstream
なり)
ただ、これmaster
から離れたままなので、今後の本家リリースがどうなるかはよくわからないけれど、場合によってはリリースの度に同じ問題が発生する可能性がある。
自分のブランチをv1.4.1
に持って行きたい場合は、
$ git reset --hard $(git merge-base v1.3.3 v1.4.1)
$ git merge v1.4.1
でいけるが、これをリモートリポジトリにpushしようとすると落ちるし(-f
が必要)、他のリポジトリからpullしようとするとそこでコンフリクトするので、あまり安易に実行できるわけでもない。
ちなみにgit merge-base
は2つのコミットの共通の祖先を返す。
その他
-
--ff-only
オプションを使うとコンフリクトが発生することがないので慌てなくて済む。
$ git merge --ff-only v1.4.1
fatal: Not possible to fast-forward, aborting.
This is a patch release that backports a few important improvements from the upcoming v1.4 release which is still a work in progress.
とあり、要するに1.3.3が本流から離れた保守リリースだった故に発生したのかなあと見ている(本家を詳しく追っているわけではないのでよくわかっていない顔)。
参考文献
- git で共通の祖先をみつける - Qiita
- Git - Reference
- Git - Book (ブランチとかマージとかfast-forwardとかってなんやねんみたいな場合はこれを一通り読むと良い)