병합(merge)
: 두 버전의 합집합을 구하는 것
병합 커밋(Merge Commit)
- 새로운 상태가 나오므로 새로운 커밋이 생긴다.
빨리 감기(Fast-forward)
- 합친 결과물이 뒤에 있는 커밋과 같다. → 새로 상태를 만들어줄 필요가 없음
충돌(Conflict)
- 같은 구간에 다른 커밋이 발생했을 경우 충돌 발생
두 병합의 차이 및 충돌 발생
초기 상태가 아래와 같이 존재할 때 이를 이용하여 두 병합의 차이를 알아보자.
1. Master 브랜치와 A 브랜치 합치기
- 새로운 커밋이 생성되지 않고 A 브랜치와 master 브랜치가 동시에 커밋 5를 가리킴
→ 빨리 감기(Fast-forward) - 둘 다 커밋 5를 가리키고 있으면 A 브랜치를 삭제해도 무방함. (이후 삭제했다고 가정)
2. master 브랜치와 B 브랜치 병합
- 새로운 커밋이 생성
- B브랜치를 중심(base)으로 병합
- 커밋 3과 커밋 5가 병합된 결과물을 B브랜치에 반영한다.
- master 브랜치에는 반영되지 않고 옛날 코드만 남는다.
소스트리 충돌(Conflict 해결)
‘main’ 브랜치와 ‘JP-test’ 브랜치를 생성
현재 main 브랜치에 jp.md라는 이름의 파일을 push 해놓은 상태이다.
JP-test 브랜치로 check out 한다.
jp.md 파일을 수정한 뒤
다시 main 브랜치로 넘어가서 파일을 수정한다.
이렇게 되면 JP-test 브랜치와 main 브랜치가 갈리게 된다.
이 상태에서 merge를 하면
이렇게 충돌이 발생한다. 충돌을 해결해 보자.
충돌이 발생했던 jp.md 파일로 다시 들어가 보자.
그럼 이런 식으로 Git에서 자동으로 충돌이 발생했던 부분을 표시해 준다.
나는 JP-test 브랜치를 base로 main를 병합했기 때문에 HEAD가 JP-test
Incoming Change가 main 브랜치이다.
방법은 위에 있는 간단하게
Accept Current | Accept incoming Change.. 를 클릭해도 되고
간략하게 <<<< HEAD부터 >>>>>main까지 필요 없는 부분을 임의로 지워도 된다.
나는 한번 Accept Both Changes를 눌러봤는데, 둘 다 적용되는 모양이다.
이렇게 처리한 뒤 다시 Source Tree로 돌아간다.
다시 정상적으로 커밋이 가능한데 특이한 점은 커밋 메시지가 자동적으로 써져 있다는 점이다.
이 커밋 메시지를 그대로 써도 되고 아니면 수정해도 된다.
이런 식으로 하면 충돌 해결을 할 수 있다.