본문 바로가기
Today I learned

2021 06 01 git린이의 모험 - 충돌이 발생하는 이유

by soheemon 2021. 6. 1.

충돌이

발생하는 이유

대충 커밋내용이 아래와 같다고 가정한다.

 

lineNo commit A commit B commit C commit D
1 1 1 1 1
2   2 fail 2 fail 2 fail - success
3     3 3
4        
5        

commit B에서 문제가 되는 fail이라는 코드를 인지하지 못하고 commitD까지 이어진 상태이다.

뒤늦게 문제를 깨달고 revert B를 했다고 가정하자. -> 충돌이 발생한다.

 

3 Way Merge

commit 1을 BASE라고 한다.

이 BASE를 기준으로 3way merge를 시작한다.

x3와 y3를 머지할때 둘의 변경사항만 단순히 비교하는것이 아니라, BASE와 line by line으로 비교를 해서 변경된 사항이 있는 라인만 살아남게 된다.

X3 1(BASE) Y3 Result
1 1 1 1
x2 2 2 x2
3 3 y3 y3
xy 4 y4 충돌발생!

revert 시 발생한 충돌을

3waymerge에

투영시켜서 이해해보자.

lineNo commit A commit B commit C commit D
1 1 1 1 1
2   2 fail 2 fail 2 fail - success
3     3 3
4        
5        

revert B를 했다면 B에서 변경된 내용을 취소시키는 원리로 가게된다. 

그러니까, 2 fail을 취소한 내용, 즉 commitD에 2번째 라인을 삭제하려한다.

문제는! 2 fail이라는 내용을 취소하려 했더니 commitD에 success라는 내용이 추가된것...! -> 충돌발생!

 

B는 A로 돌아가려고 하고, BASE는 B인것이 핵심이다.

충돌

해결하기.

사람간의 충돌도 머지툴로 간단하게 해결 할 수 있으면 얼마나 좋을까?

 

git mergetool

(설정에 따라 다르다. 나는 터미널에서 아무것도 안깔아서 vimdiff가 떴다.)

가운데가 BASE (revert 하고자 하는 commit 취소하고 싶은 버전.)

왼쪽이 LOCAL (wd의 상태?)

오른쪽이 REMOTE (BASE 이전의 commit! 되돌아가고자 하는 기준이 되는 커밋..)

 

참고해서 고친다음에 저장 && 이후에 revert --continue하면 revert 완료!

 

.orig

파일은

뭔가요?

--> 만약 실제 파일에 머지하다가 똥망하면 참고할 파일

 

댓글