호우동의 개발일지

Today :

article thumbnail

병합(merge) : 두 버전의 합집합을 구하는 것


병합 커밋(Merge Commit)

병합 커밋
병합 커밋

  • 새로운 상태가 나오므로 새로운 커밋이 생긴다.

 


빨리 감기(Fast-forward)

빨리 감기
빨리 감기

  • 합친 결과물이 뒤에 있는 커밋과 같다. → 새로 상태를 만들어줄 필요가 없음

 


충돌(Conflict)

충돌 발생
충돌 발생

  • 같은 구간에 다른 커밋이 발생했을 경우 충돌 발생

 


두 병합의 차이 및 충돌 발생

초기 상태가 아래와 같이 존재할 때 이를 이용하여 두 병합의 차이를 알아보자.

초기 상태
초기 상태

 


1.  Master 브랜치와 A 브랜치 합치기

브랜치 합치기
브랜치 합치기

  • 새로운 커밋이 생성되지 않고 A 브랜치와 master 브랜치가 동시에 커밋 5를 가리킴
    빨리 감기(Fast-forward)

  • 둘 다 커밋 5를 가리키고 있으면 A 브랜치를 삭제해도 무방함. (이후 삭제했다고 가정)

 


2. master 브랜치와 B 브랜치 병합

마스터 브랜치와 B 브랜치 합치기
새로운 브랜치가 생성됨

  • 새로운 커밋이 생성
  • B브랜치를 중심(base)으로 병합
    • 커밋 3과 커밋 5가 병합된 결과물을 B브랜치에 반영한다.
    • master 브랜치에는 반영되지 않고 옛날 코드만 남는다.

 


소스트리 충돌(Conflict 해결)

 

깃 그림

‘main’ 브랜치와 ‘JP-test’ 브랜치를 생성
현재 main 브랜치에 jp.md라는 이름의 파일을 push 해놓은 상태이다.

 

마크다운 파일

JP-test 브랜치로 check out 한다.

 

체크아웃
md 파일

jp.md 파일을 수정한 뒤
다시 main 브랜치로 넘어가서 파일을 수정한다.

 

jp.md 파일

이렇게 되면 JP-test 브랜치와 main 브랜치가 갈리게 된다.
이 상태에서 merge를 하면

 

충돌 발생

이렇게 충돌이 발생한다. 충돌을 해결해 보자.

 

충돌 병합 메시지
충돌 병합 메시지

충돌이 발생했던 jp.md 파일로 다시 들어가 보자.
그럼 이런 식으로 Git에서 자동으로 충돌이 발생했던 부분을 표시해 준다.

 

Git 파일
자동으로 알려줌

 

나는 JP-test 브랜치를 base로 main를 병합했기 때문에 HEAD가 JP-test
Incoming Change가 main 브랜치이다.

방법은 위에 있는 간단하게
Accept Current | Accept incoming Change.. 를 클릭해도 되고

간략하게 <<<< HEAD부터 >>>>>main까지 필요 없는 부분을 임의로 지워도 된다.

 

결과
결과

나는 한번 Accept Both Changes를 눌러봤는데, 둘 다 적용되는 모양이다.
이렇게 처리한 뒤 다시 Source Tree로 돌아간다.

 

결과 스크린
결과 스크린

다시 정상적으로 커밋이 가능한데 특이한 점은 커밋 메시지가 자동적으로 써져 있다는 점이다.
이 커밋 메시지를 그대로 써도 되고 아니면 수정해도 된다.

이런 식으로 하면 충돌 해결을 할 수 있다.