Merge Conflict
Automatic merge failed; fix conflicts and then commit the result.
"기획이 바뀌어서 같은 자바스크립트 파일을 3명이서 뜯어고쳤고, 우리는 퇴근을 반납했다." 도대체 어떤 녀석이 이따위로 코딩을 해놓고 푸시한 거야?
1. 개요
Merge Conflict(병합 충돌)은 Git에서 두 개 이상의 브랜치를 하나로 합치려고 할 때, 동일한 파일의 동일한 위치(Line)가 서로 다르게 수정된 것을 발견하고 깃이 자동으로 합치기를 전면 거부하는 초비상 사태를 의미한다. 컴퓨터 선에서 기계적으로 눙치고 합칠 수 없으니, "인간들아, 니들끼리 상의해서 어떤 버전을 남길지 알아서 선택해라"라며 가동을 멈추는 일종의 안전장치이자 통곡의 벽이다.(...)
2. 헤드 앤 꼬리의 시각적 테러: <<<<<<< HEAD
충돌이 발발하는 즉시, 대상 소스 코드 내부에는 평소에 보지 못했던 괴상한 표식들이 자동으로 주입된다. 현재 내가 작업하던 곳을 의미하는 <<<<<<< HEAD 영역과, 원격에서 날아와 나를 들이받은 상대방의 코드인 >>>>>>> [branch-name] 영역이 점선 =======을 경계로 마주보며 험악한 분위기를 연출한다. 이 괴상한 기호들을 에디터에서 깨끗이 청소하고 최종적으로 유효한 소스 코드로 복원하지 않은 채 빌드를 돌려버리면 당연히 신나는 컴파일 에러를 맛볼 수 있다.1
3. 진짜 해결책: 결국 인간 대 인간의 협상
충돌을 세련되게 해결해 주겠다는 온갖 찬란한 GUI 툴들과 인공지능 비서들이 쏟아져 나오고 있지만, 머지 충돌의 본질적인 해결책은 기술이 아니라 커뮤니케이션이다. 결국 기획의 맥락을 따져보고, 상대방 개발자의 자리로 직접 찾아가 쭈구려 앉아서 "혹시 이거 작업하신 부분 제가 지우고 제 코드로 덮어써도 될까요? 아니면 섞을까요?"라며 읍소하고 타협안을 마련하는 아날로그식 정치질(?)만이 유일하고 완벽한 영구 해결책이다.2
4. 관련 밈 및 드립
4.1. The Head-To-Head Trauma (헤드 표식 유출 대참사)
머지 충돌 표식인 <<<<<<< HEAD나 =======를 소스 코드에서 깜빡하고 안 지운 채 그대로 빌드해서 앱 스토어에 출시하거나 상용 웹사이트에 배포하는 대형 사고. 유저들은 '아, 이 회사는 깃 충돌도 제대로 안 고치고 배포하는구나'라며 실시간으로 조롱 거리를 던져 주게 된다.
5. 여담
- 깃의 멍청함?: 가끔 아무 죄도 없이 한 줄 띄어쓰기만 다르게 했거나 줄바꿈 문자(LF/CRLF) 설정이 어긋났을 뿐인데도 온 세상 파일을 충돌이라고 선언하며 깃이 억까를 시전하는 경우도 빈번하게 터진다.(...)
- 자연재해로서의 유니티: 소스 코드가 아닌 바이너리 파일이나 유니티(Unity)의 메타 데이터 파일(.meta) 혹은 씬(Scene) 파일에서 충돌이 나면, 코드처럼 직접 텍스트로 고칠 수가 없어 눈물을 머금고 작업분을 통째로 날려버린 뒤 재생성하는 파국을 맞이하곤 한다.