課題
gitのマージについてはたくさんの解説記事がありますが、コンフリクトの解決は、
1) mergeコマンドを実行
2) コンフリクトが発生したら、ファイルを編集して解決
3) add > commit > push または merge --continue > push
という解説になっているかと思います。
ところが、私のチームでは、最近、
・トピックブランチ同士をマージすることが多く、
・コンフリクト箇所に関係しているエンジニアが複数人に渡り、誰か一人でコンフリクト解決を完結できる状況でなく、
・その関係者がリモートワーク(テレワーク)していて、コンフリクト解決の作業を一緒にやりにくい
こんなことが増えてきています…
要するに、コンフリクト解決の作業を、離れた複数のメンバーでコラボして進めなければならない、というような状況です。
冒頭のような教科書的な手順では、対応しづらくて困っています。
解決案
(注)テスト用のリポジトリで検証したのですが、まだ実運用には乗せていませんので、解決"策"じゃなくて"案"です。
【事例】
・masterから、9月リリース向けのブランチ develop-201909 を作成している。
・develop-201909 から、12月リリース向けのブランチ develop-201912 を作成し、並行して開発を進めている。
・develop-201912 には 最終的に develop-201909 の全機能を含める必要があるため、develop-201912 に develop-201909 をマージしたい。
【手順1】
develop-201912 から、マージ作業をコラボするための作業ブランチ merge-201912 を作成する。
マージ作業中、develop-201912 にマージを行わないようにチームに報知する。
あるいは、GitLabでは設定によって禁止することができます。
(参考)GitLabでmasterへのコミットを防ぐ
【手順2】
merge-201912 に develop-201909 をマージする。この時、コンフリクトに対して何も編集せず、 <<<<<<< HEAD
などのマークもそのまま add > commit > pushしてしまう。
【手順3】
各エンジニアは、merge-201912 のコンフリクト箇所( <<<<<<< HEAD
のマークがある箇所)に対して適切な改修を行い、各々commit > pushを行う。
【手順4】
全エンジニアの手順3.の作業が終わったら、develop-201912 に merge-201912 をマージする。※コンフリクトはしないはず
【手順5】
作業が終わったら、merge-201912 は用済みなので削除。
この後試しに、develop-201912 に deveop-201909 のマージを試みると、「マージできるものはないよ」というメッセージが表示されました。
すなわち、仮に今後 deveop-201909 に追加コミットが入って再度マージをする際にも、問題はなさそうです。
まとめ
上の手順で、課題だった、「複数人でコラボしながらのマージコンフリクト解決」ができそうな感触を得ました。
デメリットとしては、手順2の <<<<<<< HEAD
などのコミットが履歴として残ってしまいます。
ですが、「どのようにコンフリクトしたか」「誰がどのように解決したか」がトレース可能なので、それはそれでメリットがあるかなと考えています。
一方、「mergeを実行した時にコンフリクトを無視する」というのは、gitのお作法から外れているようで、少々不安もあります。
ギークの方、「この案じゃこんな場合には使えないよ」とか「他にこんな上手い方法があるよ」などありましたら、コメント欄でご教示ください!
今後、上手く実運用に乗りましたら、記事をアップデートしたいと思います。