GIT 6 - Merge & Conflict
master의 브런치 버전 상태와 동시에 apple 브런치의 버전을 갖으면서 새로운 버전을 만드려면 어떻게 해야할까? 이럴때 사용하는 것이 merge이다. 그리고 이 버전들의 공통 조상을 base라 한다.
병합할 브런치들을 미리 만들었다.
master 브런치에서 o2 브런치를 병합하고 싶다면, 현재 HEAD -> o2상태인데 , 우선적으로 master 브런치 상태로 이동해야한다. (git checkout merge
).
git merge o2
로 병합한다.
그림과 같이 병합되어진다.
파일명이 같은 파일을 병합
현재 파일 상태이며, master 브런치에서는 위쪽을 수정할것이고 , 새로운 브런치 o2를 만들고 아랫쪽을 수정해서 병합할것이다.
o2의 내용을 master로 병합하고 싶다면?
git checkout master
로 가서 병합하면 된다. 그리고 그 결과
o2의 수정한 텍스트와 master의 수정한 텍스트를 알아서 병합해주는것을 볼수있다.
Conflict
같은 파일, 같은 부분을 동시에 수정하게 된다면?
파일은 이렇게 되어있으며, o2 브런치도 만들었다.
우선 master 브런치에서 중간 부분에 추가 수정하였다. 그리고 나서
o2브런치로 이동후에 , o2 브런치에서는 중간 부분을 o2로 추가하여 수정하였다. 그리고 master 브런치에서 o2 브런치를 병합하게 된다면 어떻게 될까?
이렇게 Conflict가 일어난다. 그리고 merge가 실패했다고 알려준다. 왜냐하면 같은 부분을 동시에 수정했기 때문에 일어난 사례이다. 그리고 work.txt 파일을 열어보면 어떤 상태일까?
=========== 을 중심으로 나눠지게 되는데, 위는 현재 브런치(HEAD)에서의 내용은 master이고 , 밑에는 o2 브런치에서는 o2라는 텍스트라는 것을 말해준다. 해결을 위해
다음과 같이 수정하였다.
그리고 위와 같이 다시 staging area에 올라가게 되고 커밋할 준비가 된다. 그리고 커밋하면 된다.
그 결과
잘 merge가 된것을 확인할 수 있으며, 새로운 버전이 생긴것을 볼 수 있다. merge된 버전은 master의 최신 버전과 o2의 최신 버전을 부모로 두고 있다라는 것을 알려준다
3 way merge
here | base | there | 2 way merge | 3 way merge |
A | A | A | A | A |
H | B | B | 충돌 | H |
C | C | T | 충돌 | T |
H | D | T | 충돌 | 충돌 |
2 way merge는 공통의 조상 base가 없기 때문에 수정이 일어난 줄에서, 충돌이 다 일어난다.
3 way merge는 공통의 조상 base가 있기 때문에, base를 기반으로 merge가 일어나게 되는데, 둘다 수정이 가한다면 위와 같이 충돌이 일어나고, 한 곳만 수정만 일어나게 된다면, 수정된 부분으로 merge가 일어나는 것이다.
Reference
생활코딩
https://opentutorials.org/course/3840/23682
#git
'GIT' 카테고리의 다른 글
GIT 8 - rebase (0) | 2021.02.18 |
---|---|
GIT 5 - branch (0) | 2021.02.17 |
GIT 4 - reset & revert (0) | 2021.02.17 |
GIT2 - 버전간의 차이점 (0) | 2021.02.17 |
GIT 3 - checkout (0) | 2021.02.17 |
댓글