Git branch merge 방법에 대해서

swim·2024년 8월 16일

git merge

merge는 다른 branch에 있는 커밋을 가져올때 사용한다

예를 들어서,
master, premium 브랜치가 있고, 현재 premium branch에 있을때

git merge master 
  • 현재 위치인 premium branch에 master branch 를 합치겠다
  • merge 하면 merge 커밋이라는 새로운 커밋이 생김 (merge commit)

Fast-forward merge

master branch 에 있음. (HEAD 가 master 브랜치 가리키고 있음)

이때 git merge premium 을 하면?

  • premium 브랜치가 가리키던 커밋을 master 커밋도 똑같이 가리키게 됨.
  • 총 커밋수는 그대로다
    ⇒ 새로운 커밋이 생기는게 아니라 단지 브랜치가 이동하게 되는 머지!
  • 커밋 히스토리에서 같은 선(line) 상에 있는 브랜치를 머지할 때 Fast-forward 머지가 이루어진다

3-way merge

  • 두 브랜치가 커밋 히스토리 상에서 분리된 2개의 선에 각각 존재할 때 머지를 하면 머지 커밋이 새롭게 생기는데 이런 머지를 3-way merge 라고 한다
  • 1,2,3 세가지 커밋을 고려해서 머지하기 때문

    (1)번 : 두 갈래로 갈라지기 전 공통 조상이 되는커밋
    (2)번 : 한 브랜치가 가리키는 커밋
    (3)번 : 다른 브랜치가 가리키는 커밋

master 브랜치와 premium 브랜치를 머지했을 때 상황별 결과

모든 커밋에 sample.txt 파일이 있다고 가정하면,

  • base : 두 브랜치의 공통 부모 커밋의 sample.txt 파일의 내용 중 일부 = 위 그림 (1)번
  • master : 마스터 브랜치의 최신 커밋의 sample.txt 파일의 내용 중 일부 = 위 그림 (2)번
  • premium : 프리미엄 브랜치의 sample.txt 파일의 내용 중 일부 = 위 그림 (3)번
  • 머지 결과 : master 브랜치에서 premium 브랜치를 머지했을 때의 최종 결과

머지결과에 대한 설명

case1

  • base를 기준으로 볼 때, master에서는 변화가 없었지만, premium에서는 A가 B로 변경된 상태
  • 3-way merge는 base에서 변화가 발생한 것을 우선 채택합니다. 그래서 머지 결과는 'B'가 된다

case2

  • base에서 변화가 발생한 2가 머지 결과가 됨

case3

  • "hello"를 삭제해서 공백 상태가 된 것이 변화가 더 발생한 것이기 때문에
  • 머지 결과는 공백이 됨

case4

  • 이전 경우들과 좀 다름!
  • 둘 다 base 때와는 다른 변화가 일어남 ⇒ 이렇게 두 브랜치에서 다 변화가 있을 때 ⇒ 'Git도 모른다!'
  • Conflict가 발생

3 - way merge 어떤 방식으로 이루어지는지 정리

  • base때의 내용과 비교했을 때 달라진 부분이 있는 것이 우선시되고,
  • 두 브랜치에서 둘다 변화가 일어났을 때는 Conflict를 발생시켜서 사용자가 스스로 선택하게끔 한다

0개의 댓글