본문 바로가기

깃 브랜치 (git branch) 5. 브랜치 병합 시, 충돌 해결하기 (merge conflict)

https://www.opentutorials.org/course/2708/15275


branch를 병합 할 때,

git이 자동으로 처리하는 작업을 알아보자.

자동으로 병합할 수 없는 경우(충돌 시) 처리하는 방법을 알아보자.



예를들면

Master와 브랜치(ex. exp)에서 각각 같은 이름의 파일이 있는데, 병합을 한다면?

 -> (각 파일의 다른 부분이 다름) git에서 자동으로 내용을 합쳐 준다.


그런데 겹치는 부분이 다르다면?

 -> git에서 충돌(conflict)메시지가 뜬다. 


이 충돌을 해결 해 보자.




해보기


- 상황 -


branch : master, exp


각 브랜치에는 공통적으로 'common.txt'라는 파일이 있는데, 서로의 내용은 아래처럼 다르다.



master - common.txt의 내용


exp - common.txt의 내용


같은 내용의 파일이지만, 브랜치 'exp'에서는 내용이 추가되었다.

이럴 때, 병합(merge)를 하면 어떻게 될까?



별 문제 없이 성공적으로 병합되는 모습.


같은 이름의 파일 common.txt의 내용을 보면

exp에서의 내용이 추가된 모습을 볼 수 있다.


-git-에서는 겹치는 부분이 아닌 내용이라면 자동적으로 추가해준다.





자, 이제는 겹치는 부분이 다르다면 어떻게 될까?



브랜치 master - common.txt 내용


브랜치 exp - common.txt 내용




이렇게 같은 부분의 내용이 다른데, 병합(merge)를 한다면




자동머지가 되지 않았다. common.txt가 충돌 (CONFLICT)된다.

라는 경고 표시가 나오며, 맨 아랫줄에 보면 'master|MERGING'이라고 표현된다.




(git status를 통해 충돌이 되는 파일을 알 수 있다.)


여기서 충돌의 원인이 되는 'common.txt' 파일을 vim으로 열어보자.


vim common.txt


이런 식으로 겹치는 부분이 표현된다.


해석 해 보자면,

현재 브랜치 포인트 head는 master이며, 

'======' 부분까지 master의 내용, 아래는 exp에서의 내용이다.


'i'를 눌러 원하는 형태로 수정 후, 

'esc 키' ':wq'를 통해 저장 후 빠져 나오자.






다음은 


수정한 파일을 add 한 후 commit 하면된다.


git add common.txt


git commit





커밋 창을 열어보면 위처럼 메시지가 나온다.


'All conflicts fixed but you are still merging'


충돌은 모두 해결됬지만 아직 병합 중입니다. 라고 나오니

맨위의 Merge branch 'exp'를 지우고, 원하는 메시지를 입력한 후 저장(':wq')하고 빠져 나오자.


난 '11'을 입력했다.


그럼 위처럼 정상모드로 돌아오는 것을 볼 수 있다.