【Git】コンフリクトが起きたらrebaseで解決!

もくじ

コンフリクトとは

複数人で作業をしていると、同じファイルの同じ箇所に変更を入れることも少なくありません。

しかし、ローカルで作業している時はそんなこと知らん!状態ですよね。で、プルリクエストを投げて初めてコンフリクト(衝突)してまっせ、と教えてもらえるわけです。

要は、同じ箇所に別の変更内容があるけど、どの変更を維持してマージしたらいいのかgitに尋ねられている状態が、コンフリクトした状態です。

例になぞって確認

sample.txtというファイルがあります。

  • sample.txt
test-1
test-2

AさんとBさんが別の変更をしました。

  • Aさんの変更
test-1
1+1=2
test-2
  • Bさんの変更
test-1
2+2=4
test-2

1.プルリクエストする

Aさんがはじめにプルリクエストすると問題なくマージされます。その後Bさんがプルリクエストをするとコンフリクトが起きます。

コンフリクトが起きると、それを解消するために手動でコードの見直しを行います。

2.リベースする

コンフリクトを解消するためには、まずリベースを行います。作業時のブランチで行ってください。

$ git rebase ブランチ名
$ git rebase origin/master // マスターにマージしたい場合

リベースすると、指定したブランチの最新内容をローカルにpullし同時にローカルファイルにマージも行ってくれます。マージした結果コンフリクトした部分をお知らせしてくれるのです。

また、モードがリベースモードに切り替わります。ターミナルを確認するとブランチ名の右に「REBASE」があることがわかるでしょうか。これがある場合はリベースモードです。

ブランチ名 *+|REBASE 

ブランチ名をターミナルで確認するには、その設定をしていないと見られません。詳しくはこちらの記事を確認ください。

bonoponz.hatenablog.com

3.コードの修正

コンフリクトがある場合VSCodeであればこのようになります。

test-1
<<<<<<< HEAD(現在の変更)
1+1=2
=======
2+2=4
>>>>>>> master(入力側の変更)
test-2

今回の場合、AさんBさんでそれぞれ別の計算式が追記されたのでコンフリクトが起きました。

test-1
1+1=2
2+2=4
test-2

今回はどちらの変更も残しておきたいと仮定してこのようにコードを修正しコンフリクトを解消します。

修正を反映(リベースモード)

必要な修正を行った後は以下を実行します。

〜〜 *+|REBASE 3/3) $ git add ファイル名 // 数字は場合によって変わります

このgit addは通常ステージングするためのaddコマンドとは異なります。リモートモード(ターミナルにREBASEの表示がある)で実行する場合はコンフリクトを修正したファイルをリベースにaddするイメージです。

今回の例の場合は↓これですね。

〜〜 *+|REBASE 3/3) $ git add sample.txt

リベースを続行(リベースモード)

$ git rebase --continue

ここでまだコンフリクトがあればコードの修正を再度行い、同じように実行し確認します。

(今回の例ではひとつのファイルしかないのでここで終了しますが、実際は何度か繰り返すことも多いです。)

$ git add sample.txt
$ git rebase --continue

リベースしてください的なメッセージが出なくなったら終了です。

リベースモードの終了(元に戻す)

もしリベースモードを終了したければ以下を実行します。

ただし、リベースを行なった処理は元に戻りリベース前の状態に戻りますので注意してください。

$ git rebase --abort

4.プッシュする

コンフリクトをすべて解消したらプッシュします。

$ git push oriqin ブランチ名

これにより、リモートにもコンフリクトを解消したファイルが更新されます。

5.完了

担当者にコンフリクト解消の旨を伝えレビューしてもらいましょう!OKならマージして完了です。