どうも、ねこきち(@nekokichi1_yos2)です。
現在所属しているオンラインサロンで、チーム開発をすることになり、GitとGitHubの使い方を学んでいます。
ただ、プルリクで異なるブランチをマージする際に起こるコンフリクトについて
・どう解消する?
・競合するコードはどう表示されてる?
の疑問がありました。
今回は、実際のコンフリクトがどんなものか、を備忘録として書きます。
使用したコード
//ブランチ master
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
for i in 0...10 {
print("gdafa")
print(i)
}
print("safesfaf")
}
}
//ブランチ 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")
}
}
コンフリクト時のコード
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()を除いた部分。
そして、同じ行に異なる記述がコンフリクトで示されています。
各ブランチの行を挙げると、
master
・15~18行:空白
・19~23行:コード
test1
・15~21行:コード
結果、15~21行、が重なっています。
しかし、GitHub上では、15~23行、が囲まれております。
各コードの最小最大範囲がコンフリクトの対象、になるのでしょうか。
もしくは、異なるコードの両方を足した行数が、たまたま15~23行になったのか。
それとも、>>>や<<<の行はないものと考えて良いのか。
少なくとも、>>>や<<<で囲まれている部分は同じ行で異なるコード、だということです。
コンフリクトを修正する
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
追加したコードは、
・//コンフリクト解消〜
実は、>>>や<<<のコードを削除しただけで、マージできる状態になりました。
なので、もしどのコードを修正すればいいかわからない時は、最悪>>>や<<<を削除すればコンフリクトを解消できます。
まとめ
コンフリクトに関して、
・同じ行で異なるコードが重なった場合に起こる
・>>>や<<<で囲まれた部分が競合するコード
・>>>や<<<のコードは無いものと考えて良い
と覚えておきましょう。
もし、
・手っ取り早くコンフリクトを解消したい
・競合しているコードの両方を残したい
のであれば、
・<<<<<<< ファイル名
・=======
・>>>>>>> ファイル名
の行を削除すればOKです。
今回は簡単コードでしたが、コードが多くて、ロジックが複雑な場合、慎重にコードを修正しなくてはなりません。
これからチーム開発をしていくので、積極的にメンバーとコミュニケーションを取って、最善のコードを提案できるようになりたいです。