작업한 코드들을 병합하는 과정에서 충돌이 나는 경우가 있다. 이는 주로 같은 부분을 서로 다른 브랜치에서 작업하다가 병합했을 시에 발생하는데 그 이유는 git 입장에서 병합할 때 어떤 브랜치를 우선 순위로 할지 모르기 때문이다. 지금 이렇게 말만 들으면 잘 모를 수 있는데 예제를 보면 이게 무슨 말인지 이해할 것이다.
좀 보기 쉽게 이번 포스팅에서는 간단한 html 예제로 포스팅을 진행하려고 한다.
현재 master 브랜치의 html 코드이다. 아래쪽에 보면 Java, Python 부분이 있는데 이 밑에 <li> </li>를 하나 더 추가할 것이다. 서로 다른 브랜치에서 같은 부분을 작업하고 있다는 것을 가정하기 위하여 작업용 브랜치를 하나 따서 똑같이 <li> </li>를 하나 더 추가한 다음 master 브랜치에 작업용 브랜치를 병합해보자.
방금 봤던 html 코드가 현재 master 브랜치에 있다. 그 다음 해당 위치에서 ‘충돌테스트’라는 이름의 작업용 브랜치를 하나 딴 상황이다(‘소스트리에서 브랜치 따기’ 포스팅에 브랜치 따는 방법이 나와 있으니 브랜치 따는 방법은 생략하겠습니다!). 따라서, master 브랜치나 ‘충돌테스트’ 브랜치나 현재 똑같은 html 코드가 들어있다. 여기서 이제 각 브랜치에 다르게 내용들을 추가해보자.
먼저 master 브랜치이다. 소스트리 왼쪽 master 브랜치 선택 후 해당 코드를 추가한 다음 커밋한다(이 화면은 코드 추가되고 커밋까지 되어있는 상태 -> 커밋 과정 역시 ‘소스트리에서 브랜치 따기’에 나와있습니다!). 전체코드는
아까와 다르게 <li>C</li>가 추가됐다.
이번에는 작업 브랜치인 ‘충돌테스트’ 브랜치이다. 소스트리 왼쪽 ‘충돌테스트’ 브랜치 선택 후 해당 코드를 추가한 다음 커밋한다(이 화면 역시 코드 추가와 커밋까지 되어있는 상태). 전체 코드는
아까와 다르게 <li>씨</li>가 추가됐다.
이제 master 브랜치에 ‘충돌테스트’ 브랜치를 merge(병합)시켜보자. master 브랜치 클릭 후 커서를 ‘충돌테스트’ 브랜치에 갖다 대고 마우스 오른쪽 클릭해서 ‘현재 브랜치로 충돌테스트 병합’ 을 클릭한다.
역시나 충돌이 발생했다. 발생한 이유는 아까 위에서도 언급했지만 서로 다른 브랜치가 하나의 파일 안에서 같은 위치의 내용을 수정했기 때문에 git의 입장에서는 누구의 코드를 적용해야할 지 모르는 것이다. 그래서 git은 “브랜치 너네들끼리 알아서 처리해라” 이런 식으로 넘겨버리는 것이다. 그래서 소스트리를 보게 되면
파일에 느낌표 표시가 있다. 문제가 생겼다는 뜻이다. 코드에는 어떤 식으로 충돌을 표시했는지 확인해보자. master 브랜치에서 “커밋하지 않은 변경사항”의 코드를 보면(현재 master 브랜치는 master 브랜치 + 작업용 브랜치이다. 이 부분에서 충돌이 난 것이기 때문에 작업용 브랜치로 가버리면 오히려 오류가 난다) 이런 식으로 나와있다.
이 부분을 해결해주면 된다. 지금 git은 “<li>C</li>로 하겠다는거니? <li>씨</li>로 하겠다는거니?” 이렇게 오류 메시지를 띄운 것이다. 좀 더 자세하게 설명해보면, «««<HEAD와 ======= 사이가 현재 선택(체크아웃)된 브랜치(여기서는 master 브랜치)의 파일 내용이고 =======과 >>»»>충돌테스트 사이는 병합하려는 브랜치(여기서는 “충돌테스트” 브랜치)의 파일 내용이다. 즉, HEAD는 현재 체크아웃된 브랜치라고 생각하면 되고 커밋했을 때 여기에 저장이 되는 것이다.
정리하면 “«««<HEAD, =======, »»»> 충돌테스트”가 문제가 생겼다고 알려주는 부분이므로 이 부분을 지워주고 원하는대로 코드를 수정해주면 된다. 필자는 C, 씨 둘 다 해보겠다.
다 수정했으면 이제 git에게 충돌을 해결했다고 알려줘야 한다.
스테이지에 올라가지 않은 파일에 마우스 오른쪽 버튼을 눌러서 충돌 해결 -> 해결된 것으로 표시 버튼을 눌러준다.
확인 버튼을 눌러준다.
아래쪽을 보면 스테이지에 올라가지 않은 파일이 사라지고 스테이지에 올라간 파일 부분에 느낌표가 사라졌다. 충돌이 해결됐다는 뜻이다. 이제 커밋만 해주면 끝이다. 커밋 버튼을 눌러주면
아래쪽을 보게 되면 따로 작성하지 않아도 이런 식으로 메시지가 저절로 들어가 있다. 충돌이 났기 때문에 이렇게 해결됐다는 것을 자동으로 알려주는 것이다. 물론 단지 나오는 메시지일 뿐 수정이 가능하다. 아무말을 넣지않으면 저런 식으로 저장이 된다는 소리일 뿐이다. 그림에는 없지만 필자는 ‘충돌 해결 완료’라고 메시지를 바꿀 것이다.
오른쪽 아래를 보면 <li>씨<li>만 초록색으로 추가된 것을 확인할 수 있는데, master에서 <li>C<li>가 추가된 상태에서 병합이 된 것이기 때문에 결과적으로는 <li>씨<li>만 추가된 것처럼 보이는 것이다.
이렇게 충돌 났을 시 해결방법에 대해 알아보았다. 다음 포스팅에서는 이런 충돌을 줄이기 위한 방법에 대해 알아보겠다.
참고 블로그 :