conflict는 실패가 아니라 의무 검토야
merge 도중 Git이 "CONFLICT (content):"라고 멈추면 처음에는 겁부터 나. 하지만 Git이 고장 난 게 아니라 추측을 거부한 거야. 두 branch가 같은 줄을 바꿨고 어느 의도가 맞는지는 Git이 결정할 수 없으니 사람이 답해야 해. conflict는 통합 과정의 정상적인 일부야. 망가졌다는 경보로 보느냐, 생각해야 할 지점으로 보느냐가 merge를 피하는 사람과 날마다 ship하는 사람을 가르지.
conflict가 생기면 Git은 해당 파일에 marker를 넣어. <<<<<<< HEAD와 ======= 사이가 현재 쪽, =======와 >>>>>>> other-branch 사이가 들어오는 쪽이야. 파일의 최종 모습을 결정해 직접 편집하고 marker를 없앤 뒤 git add해. 충돌한 파일을 모두 add하면 git commit으로 merge를 마무리할 수 있어. git status가 단계마다 다음 일을 알려줘.
세 가지 해결 방식이면 대부분을 다룰 수 있어. 한쪽을 통째로 채택하기: 들어오는 변경이 맞고 현재 것을 버려도 된다면 git checkout --ours file 또는 git checkout --theirs file을 실행하고 add해. 둘을 손으로 합치기: 양쪽 변경이 모두 필요할 때 쓰며 list, import, config에서 흔해. 새로 구성하기: 어느 한쪽도 단독으로 올바르지 않아 merge 결과가 양쪽 입력과 달라야 하는 logic conflict에 알맞아.
merge를 시작했지만 빠져나오고 싶다면 git merge --abort로 merge 전 상태로 돌아가. 이미 해결을 commit하고 push했다면 abort할 수 없고, 대신 git revert -m 1 <merge-hash>로 merge의 내용을 되돌릴 수 있어. merge commit의 이력 모양은 남아. 해결을 commit하기 전까지 conflict는 되돌릴 수 있다는 걸 기억해.