#25 Git - Merge & Conflict

김현준·2022년 12월 26일
0

GIT

목록 보기
25/41
post-custom-banner

이번시간에는 '충돌하다' 라는 의미를 가진 conflict 에 대해 알아보겠습니다.

git 을 사용하다 보면은 branch 를 굉장히 효율적으로 사용할 수 있기 때문에 많은 개발자들이 branch 를 끊임없이 사용하고 병합하고 , 원격저장소를 사용해서 다른사람의 작업을 합치는 경우도 생깁니다.

이러면 엄청 많은 충돌이 발생할 수 있습니다.

이번 시간에는 이 충돌이 일어났을때 git 은 내부적으로 어떤 변화가 발생하는지 알아보고 그 충돌을 해결하는 방법에 대해 알아보겠습니다.

먼저 f1.txt 파일을 만든 후 addcommit 를 하겠습니다.

-b 옵션을 통해서 exp 를 만든후에 바로 이동합니다.

이후 f1.txt 파일의 내용을 조금 수정해준 후에 addcommit 을 해줍니다.

master 로 이동해줍니다.

이후 f1.txt 파일의 내용을 조금 수정했습니다.

이때 exp 에서 수정한 내용의 위치와 master 에서 수정한 내용의 위치가 같습니다.

이전에서 merge 를 배울때 같은 파일의 같은 부분을 수정하면 병합 실패 현상이 발생했습니다.

git merge exp 를 실행하면 conflict 가 발생합니다.

자 그러면 이런 충돌이 일어났을때 git 에서는 내부적으로 어떤 변화가 발생할까요?

gistory 로 이동하고 index 의 내부를 봅시다.

특이하게도 f1.txt 왼쪽에 숫자가 각각 붙여져있습니다.

일단 첫번째것을 보면 파일의 내용은 masterexp 가 공통적으로 가지고 있던 파일의 내용과 일치합니다.

두번째는 현재 branch 의 위치에있는 masterf1.txt 파일 내용을 보여줍니다.

마지막으로 세번째는 병합이 될 대상인 expf1.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 부분이 변하게 됩니다. 즉 Abase , Blocal , Cremote 를 의미하고 누르면 그 파일의 중복된 부분이 추가가 됩니다. 여러개 체크도 가능합니다.

저는 A 를 누르고 return 'master,exp; 로 내용을 바꿔보겠습니다.

그리고 좌측 상단의 저장버튼을 누르고 창을 닫아줍니다.

이후 파일의 내용이 정상적으려 변경된 것을 확인 할 수 있습니다.

gistory 에서도 .git\index 의 파일내용도 변했습니다.

참고로 만약의 사태를 대비해서 .orig 라는 파일이 만들어 지는데 병합하기 전에 백업용으로 자동으로 만들어집니다.

이후 git commit 을 하면 상세정보를 확인 할 수 있습니다.

git log 를 하면 정상적으로 병합이 된 기록이 생깁니다.

profile
울산대학교 IT융합학부 22학번
post-custom-banner

0개의 댓글