branch 병합 시 충돌 해결
26 Feb 2019 | github 지옥에서 온 gitbranch 병합 시 충돌 해결
- merge 과정에서 파일 내용이 서로 다를 경우 충돌 발생 가능
git branch exp
로 새로운 브랜치 생성vim master.txt
를 만들고, 내용을 a로 작성 후git add master.txt
,git commit -m "6"
으로 커밋git checkout exp
후vim exp.txt
를 만들고, 내용은 a,git add exp.txt
,git commit -m "7"
으로 커밋git checkout master
후git log --branches --graph --decorate
를 확인해보면, master는 6번, exp는 7번을 가르키고 있는상태- 다음으로
git merge exp
를 하면, 두개가 서로 각자 수정한부분이 있기에 merge 커밋이 생김 - 다음으로
git log --branches --graph --decorate
를 확인해 보면 master와 exp가 병합된 새로운 master가 생성된 상태 ls -al
하면 exp 브랜치에서 만들어진exp.txt
가 생성 된 것을 확인 해 볼 수 있음- 만약 파일이 같으면 문제가 발생하게 됨
- master 브랜치와 exp 브랜치에 같은 파일이 존재하는 경우 문제 발생
git checkout exp
후vim common.txt
, 내용 function a() 작성 후git add common.txt
,git commit -m "8"
로 커밋git checkout master
후git merge exp
로 merge 실행ls -al
로 확인해보면 exp에만 존재하던 common.txt가 master에도 존재하게 되는것을 확인 할 수 있음- 다음으로
vim common.txt
에서 function b() 라는 내용을 맨 위에 추가 (현재 master branch) git commit -am "9"
로 커밋git checkout exp
후vim common.txt
에서 function c() 내용을 아래에 추가후git commit -am "10"
으로 커밋git checkout master
- 현재 common.txt파일에 대해 master와 exp가 서로 다른 부분을 수정하게 되어있는 상태가 됨
git merge exp
하여 병합vim common.txt
로 확인해보면, master에서 작성한 내용과 exp에서 작성한 내용이 둘 다 병합 된 것을 볼 수 있음- 즉, 같은 파일임에도 서로 수정한 위치가 다르다면 자동으로 합쳐주게 됨
- 같은 부분을 수정하게 되면 문제 발생
- 현재 mater의 common.txt의 내용은 병합된 상태로 function a(), function b(), function c()가 모두 보임
git checkout exp
후 common.txt의 내용을 확인해보면 function a(), function c()만 보임- exp 브랜치의 내용을 master로만 병합한 상태이므로 master의 추가/변경된 내용이 exp 브랜치에 넘어오지 않은 상태
git merge master
하면 common.txt의 내용이 master와 같은 상태가 된 것을 확인 할 수 있음git checkout mater
후vim common.txt
에서 function b()를 function b(master)로 수정git commit -am "11"
으로 커밋git checkout exp
후vim common.txt
에서 function b()를 function b(exp)로 수정git commit -am "12"
으로 커밋git checkout master
로 mater 브랜치로 온 후git merge exp
를 수행- Auto-merging common.txt에 대해 CONFLICT 에러 발생한 것을 확인 할 수 있음
git status
로 상태 확인해보면 unmerged path가 있다며 common.txt 파일이 양쪽 다 수정되어있다고 빨간색으로 뜸- 병합 실패한 상태
vim common.txt
파일을 열음 (내용이 에러에 관해 추가되어있는 상태임)- 중간에
=========
이 구분자 역할을 함. - 구분자를 중심으로 위쪽에
<<<<<<<<<HEAD
라고 되어있는 부분이 현재(master 브랜치)의 수정사항 - 구분자를 중심으로 아래에
>>>>>>>>>exp
라고 되어있는는 부분이 다른(exp 브랜치)의 수정사항 - 현재 git이 자동으로 병합하는것에 실패했기 때문에 merge를 실행한 사용자가 충돌을 해결하라고 위임한 상태임
- 사용자가 직접 표시된 부분에 대한 코드 수정이 필요함
- 구분자 및 HEAD, exp를 나타내는 관련 기호들 모두 삭제 후 충돌나는 부분에 대한 수정 실행
- function b()의 내용을 function(master, exp)로 수정
- 중간에
git add common.txt
후git status
로 확인해보면 초록색으로 conflict 상태가 사라지고 modified 상태가 된 것을 확인 할 수 있음git add conflicted_file
은 충돌난 파일에 대한 작업이 끝났다는것을
git commit
하면 conflict가 낫던것을 수정했다는 도움말과 함께 merge가 됨git log
를 보면 성공적으로 커밋이 된 것을 볼 수 있음vim common.txt
로 내용을 보면 잘 처리가 된 것을 확인 할 수 있음