#22 Git - Branch 충돌 해결

김현준·2022년 12월 25일
0

GIT

목록 보기
22/41

이번 시간에는 merge 를 하는 과정에서 파일의 내용이 서로 다를 경우 충돌이 발생할 수 있습니다. 이를 해결하는 방법과 그 과정에서 git 이 얼마나 많은 부분을 자동적으로 처리해주는지 알아보겠습니다.

또한 branch 충돌이 나는 상황에서 당황하지 말고 문제를 해결하는 것이 목표입니다.

일단 branchexp 를 만들어 줍니다. 이때 이전에 쓰던 exp 를 삭제할때 오류가 생길 수 있는데 -D 옵션을 통해 강제로 삭제가 가능합니다.

이후 master 에서 master.txt 파일을 만들어 줍니다

master.txtadd 해줍니다.

commit 도 해줍시다.

이제 exp 로 이동한 후에 exp.txt 파일을 만들어 줍니다.

여기서도 똑같이 addcommit 를 하고 mastercheckout 해줍니다.

즉 현재 상황은 위와 같습니다.
git log --branches --graph --decorate 명령을 통해 확인가능합니다.

이후 git merge exp 를 해줍니다. merge commit 는 아무것도 작성하지 않고 :wq 만 했습니다. 이후 git log --branches --graph --decorate 명령시 다음과 같이 정상적으로 병합된 것을 확인 할 수 있습니다.

또한 master 에서도 exp 에서 만든 exp.txt 파일도 병합된 것을 확인 할 수 있습니다.

즉 파일이 다르면 무조건 자동적으로 합쳐집니다.

그런데 파일이 같으면 문제가 생길 수 있습니다.
이제 masterexp 에서 같은 파일의 이름을 만들어 보겠습니다.

expcheckout 해줍시다.

common.txt 파일을 새로 만들었습니다.

common.txt 파일을 addcommit 를 해준 뒤에
mastercheckout 을 해줍니다.

이후 git merge exp 실행시 master 의 파일에서는 common.txt 가 존재하게 됩니다.

이제 master 에서 common.txt 파일 내용을 수정하고 -am 옵션을 통해 addcommit 을 동시에 실행하겠습니다.

exp 로 이동해줍시다.

그리고 common.txt 파일의 내용에 추가를 해줍니다. 이전에 master 에서는 function a() 위에 fucntion b() 를 추가했지만 exp 에서는 function a() 아래에 function c() 를 추가해줍니다.

이제 addcommit 을 하고 mastercheckout 을 해줍니다.

자 이제 어떤 상태일까요?
common.txt 파일을 masterexp 가 위치가 다르게 서로 다른부분을 수정했습니다.

master 로 이동후에 git merge exp 로 병합해주었습니다.
이후 common.txt 파일을 보니 exp 에서 수정한 내용과 master 에서 수정한 내용이 합쳐진것을 확인 할 수 있습니다

이것이 바로 git 의 강력한 기능입니다.

하지만 같은 파일에서 같은 부분을 수정하면 어떻게 될까요?

일단 exp 로 이동한 후에 common.txt 내용을 보면 병합되지 않았습니다.
master 에서 exp 내용을 병합했지만 exp 에서는 master 내용을 병합하지 않았기 때문이죠. 따라서 두 branch 의 상태가 다릅니다.

이후 exp 에서 master 의 내용을 merge 하면은 master 에 있는 common.txt 파일과 똑같은 상태가 됩니다.
중간에 오류가 생겨서 수정을 했는데 , 원래 commit.txt 의 내용은
function b(){} funtciont a(){} function c(){} 가 맞습니다.

이후 mastercheckout 해줍니다. 그리고 common.txt 파일의 내용에다가 fucntion a(master) 로 수정한 후에 addcommit 를 해줍니다.

이제 expcheckout 해줍시다.

이번에는 exp 에서 commit.txt 파일을 수정하겠습니다 function a() 의 내용을 master 에서는 fucntion a(master) 로 수정했고 exp 에서는 fuction a(exp) 로 수정했습니다.

이제 mastercheckout 해준뒤에 git merge exp 를 해줘서 병합을 해줍니다.
하지만 이때 아까와 같은 오류가 발생합니다.
git status 를 통해 상태를 확인해 보니 Unmerged paths 라고 뜹니다. 즉 병합실패란 뜻이죠
fucntion a() 에서 masterfucntion a(master) 로 수정했고 exp 에서는 fucntion a(exp) 로 수정을 했는데 , 같은 부분을 수정했기 때문입니다.

이후 vim 을 통해 common.txt 파일 내용을 봅시다.

<<<< HEAD===== 사이에 있는 function a(master) 내용이 바로 master 에서 수정된 내용이고 ===== 에서 >>>> exp 사이에 있는 function a(exp) 내용이 바로 exp 에서 수정한 내용입니다.

git 은 여러분에게 자동병합이 실패했기 때문에 merge 를 실행했을때 충돌하는 에러를 여러분이 해결하도록 위임한겁니다.

그리고 동시에 git 에서 충돌이 난 부분을 표시를 해줍니다.
이 정보를 통해서 잘 처리를 해주면됩니다.

이렇게 수정해주면 깔끔하고 오류가 나지 않을꺼같습니다.

이제 다시 add 하면 정상적으로 된 것을 확인 할 수 있습니다.

이후 commit 을 하면

정상적으로 파일의 내용이 수정된 것을 확인 할 수 있습니다.
merge 에서 conflict 발생시 이렇게 수정하시면 됩니다.

profile
울산대학교 IT융합학부 22학번

0개의 댓글