[Git] 충돌

Bam·2022년 4월 9일
0

Git

목록 보기
30/32
post-thumbnail

충돌

충돌(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 표식이 사라진 것이 보이시나요?



이렇게 오늘은 생각보다 자주 일어나는 병합 과정에서 충돌을 알아보고 해결하는 방법에 대해서 알아봤습니다. 소스트리와 같은 GUI툴이나 IDE에서 충돌을 해결됨으로 표시하는 등의 기능을 지원해주고 있지만 가급적이면 직접 해결하는 방식이 가장 안전하다고 할 수 있습니다.

profile
나는 나대로🥉

0개의 댓글