Git コンフリクト解消手順

## 概要
いつの日か訪れるコンフリクト解消の日のための備忘録。
（つまりコンフリクト解消手順）

## 状況
作業ブランチで編集したのち、プルリクを出したらコンフリクトが！

#### ツール
* gitlab
* netbeans

#### 登場ブランチ
* develop(マージ先)
* a_branch(すでにdevelopにマージ済み)
* **b_branch(作業ブランチ)**

#### 前提条件
作業ブランチ(b_branch)からdevelopにプルリク出している。
先にa_branchがマージされてて、そのブランチで編集されたものと競合したらしい。

#### プルリク出した時にコンフリクト起こしてると、こう表示されるはず
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197235/617bd007-f8f7-f2c8-be0a-61fc7db99d6b.png)

## 手順

### developを最新の状態に
```bash
# ブランチをdevelopに切り替えて
git checkout develop

# pullする（リモートの状態を反映させて最新に）(fetch + mergeでもOK)
git pull origin develop
```

### 作業ブランチにdevelopをマージする
```bash
# 作業ブランチに切り替えて
# git checkout <作業ブランチ>
git checkout b_branch

# developをマージ
git merge develop
```

そしたら、コンフリクト発生してるぜって出るはず。

```bash:出力
Auto-merging fuel/app/classes/util/message.php
CONFLICT (add/add): Merge conflict in fuel/app/classes/util/message.php
Automatic merge failed; fix conflicts and then commit the result.
```

## 状態を確認してみる
```bash
git status
```
```bash:出力
On branch b_branch
# ここにも、マージできなかった旨がかいてある
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

# a_branchが追加してたファイルで、コンフリクト起こしてないから自動マージされたやつ
Changes to be committed:

        new file:   fuel/app/classes/util/ahoge.php

# コンフリクト起こして自動マージできなかったやつ
# ※これを修正してコンフリクト解消する必要がある！※
Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both added:      fuel/app/classes/util/message.php
```

ログも見てみる(IDEのプラグインとか他のツールで確認でもよい)

```bash
git log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
```
(※.gitconfigにaliasを設定して「git graphall」で確認できるようにしている)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197235/b0930472-e076-132d-c5f7-de6a39f4c6ea.png)

## では、コンフリクト解消する
今回はnetbeansで解消するが、方法はIDE使用せずエディタで行ってもなんでもいい。
#### 確認
`both added`と表示されていたコンフリクト起こしてるファイル `fuel/app/classes/util/message.php`がこのように赤く表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197235/931a7627-f60f-9520-6e61-7f99aff0ee73.png)

対象のファイルを開くと、コンフリクト起こした部分は以下のように表示される

```php
<<<<<<< HEAD
# 作業ブランチでの変更内容
・・・
=======
# develop(マージしたブランチ)での変更内容
・・・
>>>>>>> develop
```

今回はこんな感じになってる。
ファイルの新規作成及び定数の追加をa_branchでも(作業ブランチ)b_branchでも行っていた。

```php:message.php
<<<<<<< HEAD
<?php

class Util_Message
{
	const B_MESSAGE_1 = 'bbranchが追加したメッセージ 1個目。';
	const B_MESSAGE_2 = 'bbranchが追加したメッセージ 2個目。';
=======
<?php

class Util_Message
{
	const A_MESSAGE_1 = 'abranchが追加したメッセージ 1個目。';
	const A_MESSAGE_2 = 'abranchが追加したメッセージ 2個目。';
>>>>>>> develop
}
```
#### 差分を確認しながら編集する
対象のファイルを右クリック→`Git`→`差分`→`HEADとの差分`を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197235/1ee83051-b390-2898-518f-d2e5965f4cfe.png)

これで差分を見ながら修正できる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197235/4eb75330-fa38-9bba-5c21-20613eb40eb9.png)

修正するとこんな感じ。どんな修正をしたか見やすい。
これで保存。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197235/5e2b9840-4f88-e677-a82c-f880ee67f32f.png)

#### 編集したファイルをステージする
これしないと、gitはコンフリクト解消したことに気づきません

```bash
git add fuel/app/classes/util/message.php
```
#### 確認

```bash
git status
```

コンフリクトが解消されたこと・`Changes to be committed:`に編集したファイルが追加されたことが分かる

```bash:出力
On branch b_branch
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

        new file:   fuel/app/classes/util/ahoge.php
        modified:   fuel/app/classes/util/message.php

```

#### あとはcommitとpushすればOK
```bash
git commit -m "コンフリクト解消" # デフォルトのマージコミットコメントを使用する場合は、git commitのみでenter。エディタが開くので、コミットコメントを保存。

git push origin b_branch
```

#### 一応、ログ見ておこうかな
枝分かれしてたのが、ちゃんと集結？（語彙力）してます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197235/db4195e9-0cf8-bd7c-4958-99ed8f297020.png)

#### gitlabを確認してみる
プルリクの画面を開くと、コンフリクト解消されたのでメッセージかわってるはず
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197235/4ad7aa0c-c6ca-7726-eba5-7698c4258a4c.png)


### おわり

## あとがき
* 今回はmergeで解消したけど、rebaseでの方法もあり（やったことない）
* vimとか使ってるなら、git mergetoolでファイル編集するとよさそう？