[git] リモートワーカーが多いチームでコンフリクト解決を複数人でコラボして進めたい

# 課題

gitのマージについてはたくさんの解説記事がありますが、コンフリクトの解決は、
1) mergeコマンドを実行
2) コンフリクトが発生したら、ファイルを編集して解決
3) add > commit > push または merge --continue > push 
という解説になっているかと思います。

ところが、私のチームでは、最近、
・トピックブランチ同士をマージすることが多く、
・コンフリクト箇所に関係しているエンジニアが複数人に渡り、誰か一人でコンフリクト解決を完結できる状況でなく、
・その関係者がリモートワーク（テレワーク）していて、コンフリクト解決の作業を一緒にやりにくい
こんなことが増えてきています…

要するに、**コンフリクト解決の作業を、離れた複数のメンバーでコラボして進めなければならない**、というような状況です。
冒頭のような教科書的な手順では、対応しづらくて困っています。:thinking:

# 解決案

（注）テスト用のリポジトリで検証したのですが、**まだ実運用には乗せていません**ので、解決"策"じゃなくて"案"です。

**【事例】**
・masterから、9月リリース向けのブランチ **develop-201909** を作成している。
・develop-201909 から、12月リリース向けのブランチ **develop-201912** を作成し、並行して開発を進めている。
・develop-201912 には 最終的に develop-201909 の全機能を含める必要があるため、**develop-201912 に develop-201909 をマージ**したい。
<img width="1215" alt="スクリーンショット 2019-08-13 7.26.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/7aacd12e-14a9-086a-d502-cb41a431a67a.png">

**【手順1】**
develop-201912 から、マージ作業をコラボするための作業ブランチ **merge-201912** を作成する。
<img width="1215" alt="スクリーンショット 2019-08-13 7.27.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/31906b46-d341-77b4-18f4-e13f38c94e5d.png">
**マージ作業中、develop-201912 にマージを行わないようにチームに報知する。**
あるいは、GitLabでは設定によって禁止することができます。
（参考）[GitLabでmasterへのコミットを防ぐ](https://qiita.com/no-use-kuro/items/810895688d508f699ae9)

**【手順2】**
merge-201912 に develop-201909 をマージする。この時、コンフリクトに対して何も編集せず、 `<<<<<<< HEAD` などのマークもそのまま add > commit > pushしてしまう。
<img width="1215" alt="スクリーンショット 2019-08-13 7.30.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/1273620b-cd58-4d8c-72e0-b176d19bebd6.png">
<img width="1215" alt="スクリーンショット 2019-08-13 7.32.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/0d5761d0-f242-d375-3399-8b73c7e9bd59.png">

**【手順3】**
各エンジニアは、merge-201912 のコンフリクト箇所（ `<<<<<<< HEAD` のマークがある箇所）に対して適切な改修を行い、各々commit > pushを行う。
<img width="1215" alt="スクリーンショット 2019-08-13 7.33.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/dc9f6468-c7da-00a0-bbd7-5f4d9a262c65.png">

**【手順4】**
全エンジニアの手順3.の作業が終わったら、develop-201912 に merge-201912 をマージする。※コンフリクトはしないはず
<img width="1215" alt="スクリーンショット 2019-08-13 7.35.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/824797ff-2546-b115-ebde-3dc89f42c85c.png">

**【手順5】**
作業が終わったら、merge-201912 は用済みなので削除。
<img width="1215" alt="スクリーンショット 2019-08-13 7.36.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/d9929f1f-ea28-57bc-62b5-3ef345aa5947.png">

この後試しに、develop-201912 に deveop-201909 のマージを試みると、「マージできるものはないよ」というメッセージが表示されました。
すなわち、仮に今後 deveop-201909 に追加コミットが入って再度マージをする際にも、問題はなさそうです。
<img width="559" alt="スクリーンショット 2019-08-12 20.42.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/96cc69d7-3958-31b9-8e2f-2b1174719a44.png">

# まとめ

上の手順で、課題だった、「複数人でコラボしながらのマージコンフリクト解決」ができそうな感触を得ました。

デメリットとしては、手順2の `<<<<<<< HEAD` などのコミットが履歴として残ってしまいます。
ですが、「どのようにコンフリクトしたか」「誰がどのように解決したか」がトレース可能なので、それはそれでメリットがあるかなと考えています。

一方、「mergeを実行した時にコンフリクトを無視する」というのは、gitのお作法から外れているようで、少々不安もあります。
ギークの方、「この案じゃこんな場合には使えないよ」とか「他にこんな上手い方法があるよ」などありましたら、コメント欄でご教示ください！:bow_tone1:

今後、上手く実運用に乗りましたら、記事をアップデートしたいと思います。