WEB開発を進めている際に、機能によっては複数に分割してプルリクを出すことはよくあるケースです。
その中でも、同じファイルの変更を行っている場合(例えば、ルーティングだとか)、コンフリクトを避けれない場合があります。
そのような場合、二通りの方法が考えられます。(他にもあるかもだけど)
- リモートリポジトリ上で直接解決する
- ローカル環境で解決後にプルリクを出す
二つとも見ていきますね。
GitHub: リモートリポジトリ上で直接解決する
まず、GitHubのリモートリポジトリ上で解決する方法です。例として、複数のプルリクエストが存在しているとします。
その後、一つのプルリクに Approve をもらったものをmaster など親ブランチにマージした後、片方のプルリクも 同じマージ先になっている場合、コンフリクトの可能性が考えられます。(というか、話的に同じファイルを変更していて、コンフリクトしてますぜ、ということにしておいてください)
コンフリクトが存在する場合は、以下画像のように、「!」マークが表示され、GitHub上のエディタで編集し、解決することになります。
赤枠の部分をクリックすることで、コンフリクト箇所の確認ができ、編集することができます。
編集が必要なコード部分を修正したあと、画面右上あたりに、「Mark as resolved」というボタンをクリックすることができるようになるので、クリックすると当該ファイルの編集は完了となります。
複数のファイルにコンフリクトが発生している場合、繰り返し作業を進めていくことで、最終的に以下画像の「Commit merge」が表示されます。
コンフリクト解決できれば、再度レビュワーに確認依頼後、Approveをもらうことでマージが可能になります。
このコンフリクト修正作業は、自身の中で想定範囲内であることが望ましいし、大きなプルリクではない場合の方が良いです。
なぜなら、想定しないコンフリクトの場合、例えば、実装したコードの箇所が複雑であった場合、GitHub上のエディタでは意図しない空白や段落が含まれる可能性が高くなるからです。
やはり、自分が慣れたエディタで作業をするほうがミスが少なくなるのでそちらを利用するほうが良いです。
また、リモート上で編集すると、動作確認が少し手間(ローカルで git pull
しなければならない)し、さらにマージコミットが入る、ということがあります。
Git: ローカル環境で解決後にプルリクを出す
基本的には、こちらをおすすめします。
作業順は以下です。
step
1リモートのマージ後、ローカルの master へ checkout後、最新状態に
すでに Approve
をもらったプルリクを master へマージ後、自身の開発環境のローカルで git checkout master
します。その後、git pull
でマージしたものを取り込みます。
step
2次にプルリク予定のブランチをリベースし最新状態に
次にプルリクエストする予定の開発ブランチに git checkout
します。
その後、git rebase master
で さきほど master で取り込んだ変更を、ブランチに取り込みます。
step
3ローカルでコンフリクトを解決する
git rebase
すると、同じファイル変更箇所にコンフリクトのエラーが発生します。
そこで使い慣れた各エディタでコンフリクトを修正し、コミットすることで「変更内容を再コミット」することができます(マージコミットは発生しないというのがミソ)
エラーが出たからといって、リベースが終了するわけではなく、コンフリクト修正がある場合はそれを解決した後、コミットすることで、リベースが確定完了します。ですので、結果的に開発作業コミットだけを並べたプルリクを出すことができ、マージコミットが含まれることはないので、美しいコミット履歴のままプルリクを出すことができます。
メリットとしては、
- コンフリクト解決後にレビュワーに再度確認をお願いしなくても済む。
- すでに最新の状態を取り込むことができているので、レビュワーの開発環境で動かない可能性を極力減らせる
- 自身の脳内想定を切り捨てることができる
ただ、一つだけデメリットを上げるとすれば、リモートリポジトリ(GitHub)上に作業済みのプルリクを積み上げることができないので、第三者に成果や作業量が見えにくいといったことが考えられます。
(ま、べつに他にもありますーとか伝えればよいだけかもだけど。いちいちそんなことで成果ガーもどうかと思うけど)
GitHub上にプルリクを積み上げるとしても、小さい単位(10コミット以下ぐらい?)であれば、別にだと思うし、ケースバイケースだとは思います。とかく、基本はローカル開発環境でできるだけ作業を完結して、極力リモートリポジトリは触らない、という方が結果的に「吉」なのかなと思っています。