이번시간에는 '충돌하다' 라는 의미를 가진 conflict
에 대해 알아보겠습니다.
git
을 사용하다 보면은 branch
를 굉장히 효율적으로 사용할 수 있기 때문에 많은 개발자들이 branch
를 끊임없이 사용하고 병합하고 , 원격저장소를 사용해서 다른사람의 작업을 합치는 경우도 생깁니다.
이러면 엄청 많은 충돌이 발생할 수 있습니다.
이번 시간에는 이 충돌이 일어났을때 git
은 내부적으로 어떤 변화가 발생하는지 알아보고 그 충돌을 해결하는 방법에 대해 알아보겠습니다.
먼저 f1.txt
파일을 만든 후 add
와 commit
를 하겠습니다.
-b
옵션을 통해서 exp
를 만든후에 바로 이동합니다.
이후 f1.txt
파일의 내용을 조금 수정해준 후에 add
와 commit
을 해줍니다.
master
로 이동해줍니다.
이후 f1.txt
파일의 내용을 조금 수정했습니다.
이때 exp
에서 수정한 내용의 위치와 master
에서 수정한 내용의 위치가 같습니다.
이전에서 merge
를 배울때 같은 파일의 같은 부분을 수정하면 병합 실패 현상이 발생했습니다.
즉 git merge exp
를 실행하면 conflict
가 발생합니다.
자 그러면 이런 충돌이 일어났을때 git
에서는 내부적으로 어떤 변화가 발생할까요?
gistory
로 이동하고 index
의 내부를 봅시다.
특이하게도 f1.txt
왼쪽에 숫자가 각각 붙여져있습니다.
일단 첫번째것을 보면 파일의 내용은 master
와 exp
가 공통적으로 가지고 있던 파일의 내용과 일치합니다.
두번째는 현재 branch
의 위치에있는 master
의 f1.txt
파일 내용을 보여줍니다.
마지막으로 세번째는 병합이 될 대상인 exp
의 f1.txt
내용이 담겨져 있습니다.
git
은 이를 통해서 three-way merge
라는 병합이 이루어집니다.
즉 공통이 되는 파일 , 각자의 파일 2개를 통해 git
은 자동으로 병합을 하게 됩니다.
.git\ERGE_HEAD
에는 병합이 되는 대상의 최신 commit
이 존재합니다. 즉 exp
를 가르키네요.
.git\ORIG_HEAD
에서는 병합에서 오류가 발생할 가능이 있거나 위험한 작업을 수행할 것을 대비해서 이전의 작업으로 돌아가기 위해 백업을 해두는 저장소 입니다.
그리고 .git\object
에는 충돌한 파일에 대한 내용을 담고 있습니다.
이는 git bash
에서도 확인가능합니다.
이제부터 병합작업을 직접 수정하는게 아니라 전문적으로 도와주는 도구를 사용해보겠습니다.
kdiff3
를 사용하기 위해서 git config -global merge.tool kdiff3
로 설치해줍니다
git mergetool
을 실행해보겠습니다.
이후 git log --branches --graph --decorate
를 해보시면 현재 상태를 볼 수 있습니다.
kdiff3 설치 링크 이 링크로 가서 설치를 해줍시다.
그리고 merge
오류가 난 상태에서 git mergetool
을 실행하면 kdiff3
가 실행이 됩니다.
기존의 공통된 지점을 base
라고 부릅니다.
또한 현재 checkout
되어있는 곳을 local
이라고 부르고
merge
를 당하는 쪽은 remote
라고 부릅니다.
이후 화면 상단의 A
를 누르게 되면 밑에있는 Output
부분이 변하게 됩니다. 즉 A
는 base
, B
는 local
, C
는 remote
를 의미하고 누르면 그 파일의 중복된 부분이 추가가 됩니다. 여러개 체크도 가능합니다.
저는 A
를 누르고 return 'master,exp;
로 내용을 바꿔보겠습니다.
그리고 좌측 상단의 저장버튼을 누르고 창을 닫아줍니다.
이후 파일의 내용이 정상적으려 변경된 것을 확인 할 수 있습니다.
gistory
에서도 .git\index
의 파일내용도 변했습니다.
참고로 만약의 사태를 대비해서 .orig
라는 파일이 만들어 지는데 병합하기 전에 백업용으로 자동으로 만들어집니다.
이후 git commit
을 하면 상세정보를 확인 할 수 있습니다.
git log
를 하면 정상적으로 병합이 된 기록이 생깁니다.