본문 바로가기

Git

[Git] 무시무시한 conflict를 해결해보자

반응형

이번 포스팅에서는 git 사용자라면 누구나 한 번 보고 두려워(?)했을 conflict 이슈를 해결하는 방법에 대해 알아보고자 한다. conflict 는 주로 서로 다른 branch에서 동일한 파일의 동일한 부분을 수정했을 때 발생하는 문제이다.

 

Github

 

다음과 같이 2개의 branch인 master 과 dev 브랜치에 동일한 파일 work1.py가 있다고 가정해보자.

 

 

이제 master 브랜치에서 work1.py 파일을 다음과 같이 수정하고 add, commit 시키자. 그리고 dev1 브랜치로 이동 후에 work1.py 파일을 수정하되 master 브랜치에서 수정한 부분과는 다른 부분을 수정해보자.

 

 

이제 master 브랜치에서 dev1 브랜치를 merge 시켜보고, dev1 브랜치에서도 master 브랜치를 merge 시켜보자.

 

 

먼저 master 브랜치로 옮겨가 dev1 브랜치를 merge 하면 recursive한 방법으로 merge 한 것을 볼 수 있다. 이유는 서로 다른 부분을 수정했고 공통의 조상을 기준으로 merge 했기 때문이다. 이 상태에서 dev1 브랜치로 옮겨가 master 브랜치를 merge 하면 그 때 master 브랜치는 이미 dev1의 조상이 되어 있기 때문에 dev1에서 master를 merge할 때는 Fast-forward 방식으로 merge가 이루어 진다.(merge 방식에 대한 설명에는 이전 포스팅에서 설명되어 있으니 여기를 참고하자)

 

위와 같이 서로 다른 부분을 수정하면 merge 할 때 conflict 에러가 발생하지 않는다. 이제 서로 동일한 부분을 수정하면 어떤 일이 발생하는지 살펴보자.

 

 

위와 같이 work1.py 파일에 서로 다른 부분을 수정하고 master 브랜치에서 dev1 브랜치를 merge 시켜보자.

 

 

work1.py 에 대한 conflict 메세지가 발생한 것을 볼 수 있다. git status로 상태를 출력해보니 'both modified' 라고 하면서 두 개의 브랜치에서 work1.py 에 대해 동일한 부분을 수정했고 git은 이 동일한 부분에 대해 어떤 브랜치의 내용을 따라야 하는지 몰라서 conflict를 발생시킨 것이다. 그러면 conflict를 어떻게 해결할까? master 브랜치에서 conflict가 발생한 work1.py 파일을 에디터로 열어보자.

 

 

파일을 열어보니 내가 입력하지 않은 특수문자들이 생겼다! 바로 git이 서로 다른 브랜치에서 어떤 부분이 충돌되는지 친절하게 표시해놓은 것이다. 우선, ====== 이것은 구분자이다. 즉, 서로 다른 브랜치에서 어떤 내용들이 conflict가 발생한지 위, 아래로 브랜치의 각 내용을 구분해 놓았다. 그리고 <<<<< HEAD 부분은 HEAD 즉, 현재 내가 머물고 있는 브랜치에서 conflict가 발생한 내용이고 >>>>>> dev1 은 merge하려고 한 dev1 브랜치에서 발생한 conflict 내용이다. 결국 현재 print('Hello world', 'master') 과 print('Hello world', 'dev1') 의 충돌 때문에 발생한 것인데, 이를 다음과 같이 바꿔주고 <<<, ===, >>> 같은 특수문자 기호를 삭제해주고 저장해준 후 수정한 work1.py 파일을 add, commit 하면 confilct가 해결이 된다.

 

 

 

 

반응형