이번 시간에는 merge
를 하는 과정에서 파일의 내용이 서로 다를 경우 충돌이 발생할 수 있습니다. 이를 해결하는 방법과 그 과정에서 git
이 얼마나 많은 부분을 자동적으로 처리해주는지 알아보겠습니다.
또한 branch
충돌이 나는 상황에서 당황하지 말고 문제를 해결하는 것이 목표입니다.
일단 branch
로 exp
를 만들어 줍니다. 이때 이전에 쓰던 exp
를 삭제할때 오류가 생길 수 있는데 -D
옵션을 통해 강제로 삭제가 가능합니다.
이후 master
에서 master.txt
파일을 만들어 줍니다
master.txt
를 add
해줍니다.
commit
도 해줍시다.
이제 exp
로 이동한 후에 exp.txt
파일을 만들어 줍니다.
여기서도 똑같이 add
와 commit
를 하고 master
로 checkout
해줍니다.
즉 현재 상황은 위와 같습니다.
git log --branches --graph --decorate
명령을 통해 확인가능합니다.
이후 git merge exp
를 해줍니다. merge commit
는 아무것도 작성하지 않고 :wq
만 했습니다. 이후 git log --branches --graph --decorate
명령시 다음과 같이 정상적으로 병합된 것을 확인 할 수 있습니다.
또한 master
에서도 exp
에서 만든 exp.txt
파일도 병합된 것을 확인 할 수 있습니다.
즉 파일이 다르면 무조건 자동적으로 합쳐집니다.
그런데 파일이 같으면 문제가 생길 수 있습니다.
이제 master
와 exp
에서 같은 파일의 이름을 만들어 보겠습니다.
exp
로 checkout
해줍시다.
common.txt
파일을 새로 만들었습니다.
common.txt
파일을 add
와 commit
를 해준 뒤에
master
로 checkout
을 해줍니다.
이후 git merge exp
실행시 master
의 파일에서는 common.txt
가 존재하게 됩니다.
이제 master
에서 common.txt
파일 내용을 수정하고 -am
옵션을 통해 add
와 commit
을 동시에 실행하겠습니다.
exp
로 이동해줍시다.
그리고 common.txt
파일의 내용에 추가를 해줍니다. 이전에 master
에서는 function a()
위에 fucntion b()
를 추가했지만 exp
에서는 function a()
아래에 function c()
를 추가해줍니다.
이제 add
와 commit
을 하고 master
로 checkout
을 해줍니다.
자 이제 어떤 상태일까요?
common.txt
파일을 master
와 exp
가 위치가 다르게 서로 다른부분을 수정했습니다.
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(){}
가 맞습니다.
이후 master
로 checkout
해줍니다. 그리고 common.txt
파일의 내용에다가 fucntion a(master)
로 수정한 후에 add
와 commit
를 해줍니다.
이제 exp
로 checkout
해줍시다.
이번에는 exp
에서 commit.txt
파일을 수정하겠습니다 function a()
의 내용을 master
에서는 fucntion a(master)
로 수정했고 exp
에서는 fuction a(exp)
로 수정했습니다.
이제 master
로 checkout
해준뒤에 git merge exp
를 해줘서 병합을 해줍니다.
하지만 이때 아까와 같은 오류가 발생합니다.
git status
를 통해 상태를 확인해 보니 Unmerged paths
라고 뜹니다. 즉 병합실패란 뜻이죠
fucntion a()
에서 master
는 fucntion 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
발생시 이렇게 수정하시면 됩니다.