충돌(conflict)
는 병합 과정에서 일어나는 현상입니다. 깃으로 작업을 진행하면서 작업 파일의 같은 위치를 동시에 수정했을 경우 발생합니다. 혼자서 개발하는 경우 잘 일어나지 않지만, 여러명이서 개발하는 경우 제법 자주 볼 수 있습니다.
충돌이 발생하는 경우 깃
에서는 어떤 수정사항이 적용되어야하는지 알 수 없으므로 개발자가 추가적인 작업을 해주어 충돌을 없애주어야 정상적인 병합이 수행됩니다.
먼저, 충돌 상황을 해결하기에 앞서, 고의적으로 충돌 상황을 만들어보겠습니다.
현재 실습 파일의 구성은 위 사진과 같습니다.
먼저 c
라는 브랜치를 만들고, c
브랜치로 이동합니다. 그 다음 t1.txt
를 다음과 같이 수정하고 커밋해주세요.
git branch c
git checkout c
vim t1.txt
git commit -am 'c에서 t1.txt 수정'
다음으로 master 브랜치로 돌아와서 t1.txt
를 다음과 같이 수정하고 커밋해주세요.
git checkout master
vim t1.txt
git commit -am 'master에서 t1.txt 수정'
그러면 현재 이 작업 디렉토리의 상황은 다음과 같습니다.
동일한 파일의 동일한 위치를 수정했기에 병합을 실시하는 경우 충돌
을 발생시킵니다.
그러면 충돌을 일으키고 해결하는 방법에 대해서 알아보겠습니다. merge
명령을 통해서 브랜치를 병합해주세요.
git merge c
병합 과정에서 CONFLICT
라고 충돌했다고 알리며 어떤 파일에서 충돌이 되었는지도 알려줍니다. 그리고 자동 병합이 실패했으니, 충돌을 수정하고 다시 병합을 하라 라고 이야기 하고 있습니다.
이때 git status
로 현재 깃 상황을 보면 커밋되지 않은 변경사항이 하나 생겨납니다. 또한 브랜치를 표시하는 부분 옆에 |MERGING
이라는 표시가 나타나게 됩니다. 따라서 브랜치명 옆에 해당 표시가 나타났다면 충돌이 발생했다는 것을 알 수 있게 됩니다.
충돌 상황이 발생했음을 확인했으니, 충돌을 해결해보도록 하겠습니다. 깃에서 알려준 파일을 열어줍니다. 그러면 파일이 다음처럼 변해있을 것 입니다.
충돌은 파일내에서 다음과 같이 표시됩니다.
<<<<<<< HEAD
현재 기준 브랜치(master)의 내용
========
병합하려는 브랜치의 내용
>>>>>>> 브랜치 이름
이렇게 표시된 충돌 부분의 내용을 수정하면 됩니다. 이때 충돌 안내 기호도 함께 삭제해주어야 합니다. 저는 master 브랜치의 수정내역만 남기도록 하겠습니다.
이렇게 충돌을 해결했다면, 다시 파일을 스테이징하고, 커밋하면 충돌이 해결됩니다.
무사히 커밋이 되고, 브랜치명 옆에 |MERGING
표식이 사라진 것이 보이시나요?