GitHubのコンフリクトについてまとめてみた

<p>どうも、ねこきち（<a href="https://mobile.twitter.com/nekokichi1_yos2"　target="_blank>@nekokichi1_yos2</a>）です。</p>

現在所属しているオンラインサロンで、チーム開発をすることになり、GitとGitHubの使い方を学んでいます。

ただ、プルリクで異なるブランチをマージする際に起こるコンフリクトについて
・どう解消する？
・競合するコードはどう表示されてる？
の疑問がありました。

今回は、**実際のコンフリクトがどんなものか**、を備忘録として書きます。

## 使用したコード


```swift
//ブランチ master
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        
        
        for i in 0...10 {
            print("gdafa")
            print(i)
        }
        print("safesfaf")
    }


}
```
<img width="352" alt="スクリーンショット 2020-08-11 15.35.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/b105b9a3-4cdb-c851-9e57-2edcac4ee1e1.png">

```swift
//ブランチ　test1
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //fsdae3
        //for i in 0...10
        for i in 0...10 {
            print("gdafa")
            print(i)
        }
        print("safesfaf")
    }


}
```
<img width="352" alt="スクリーンショット 2020-08-11 15.35.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/9b29c453-5082-6a1f-0bc5-cba8e42f7572.png">

## コンフリクト時のコード

```swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        <<<<<<< test1
        //fsdae3
        //for i in 0...10
        =======
        
        
        
        
        >>>>>>> master
        for i in 0...10 {
            print("gdafa")
            print(i)
        }
        print("safesfaf")
    }


}
```
競合している部分は、ViewDIdLoad()内のsuper.viewDidLoad()を除いた部分。

そして、同じ行に異なる記述がコンフリクトで示されています。

<img width="502" alt="スクリーンショット 2020-08-11 15.35.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/e3c14457-26f9-e42c-1677-f3dadd618d87.png">

各ブランチの行を挙げると、
master
・15~18行：空白
・19~23行：コード
test1
・15~21行：コード

結果、**15~21行**、が重なっています。

しかし、GitHub上では、**15~23行**、が囲まれております。

各コードの最小最大範囲がコンフリクトの対象、になるのでしょうか。

もしくは、異なるコードの両方を足した行数が、たまたま15~23行になったのか。

それとも、>>>や<<<の行はないものと考えて良いのか。

少なくとも、**>>>や<<<で囲まれている部分は同じ行で異なるコード**、だということです。

## コンフリクトを修正する

```swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //fsdae3
        //for i in 0...10
        
        
        //コンフリクト解消〜
        
        for i in 0...10 {
            print("gdafa")
            print(i)
        }
        print("safesfaf")
    }


}
```

削除したコードは、
・<<<<<<< test1
・=======
・>>>>>>> master

追加したコードは、
・//コンフリクト解消〜

実は、>>>や<<<のコードを削除しただけで、マージできる状態になりました。
<img width="302" alt="スクリーンショット 2020-08-11 15.35.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/5576234a-3e4b-da08-5f50-77a575a2d358.png">

なので、もしどのコードを修正すればいいかわからない時は、最悪>>>や<<<を削除すればコンフリクトを解消できます。


## まとめ

コンフリクトに関して、
・**同じ行で異なるコードが重なった場合に起こる**
・**>>>や<<<で囲まれた部分が競合するコード**
・**>>>や<<<のコードは無いものと考えて良い**
と覚えておきましょう。

もし、
・**手っ取り早くコンフリクトを解消したい**
・**競合しているコードの両方を残したい**
のであれば、
・<<<<<<< ファイル名
・=======
・>>>>>>> ファイル名
の行を削除すればOKです。

今回は簡単コードでしたが、コードが多くて、ロジックが複雑な場合、慎重にコードを修正しなくてはなりません。

これからチーム開発をしていくので、積極的にメンバーとコミュニケーションを取って、最善のコードを提案できるようになりたいです。