Git - Merge

Jnnsu·2023년 12월 3일
1
post-thumbnail

1. Squash & Merge


Squash는 여러개의 커밋을 하나의 커밋으로 합치는 것을 의미한다. Squash Merge는 병합할 브랜치의 모든 커밋을 하나의 커밋으로 Squash한 새로운 커밋을 Base 브랜치에 추가하는 방식으로 병합하는 것을 의미한다.

Squash를 하게 되면 모든 커밋 이력이 하나의 커밋으로 합쳐지며 사라진다는 점을 주의해야한다.

2. Fast-forward

새로운 커밋이 생기는 게 아니라 단지 브랜치가 최신 커밋으로 이동하게 되는 머지를 Fast-forward 머지라고 한다.

이 상태에서 git merge premium을 실행하면 아래와 같이 된다.

master 브랜치와 premium 브랜치 같이 커밋 히스토리에서 같은 선(line) 상에 있는 브랜치를 머지할 때 Fast-forward 머지가 이루어진다.

3. 3-way merge

두 브랜치가 커밋 히스토리 상에서 분리된 2개의 선에 각각 존재할 때 머지를 하게 되면 머지 커밋이 새로 생긴다. 이런 경우를 3-way merge라고 한다.

이름이 3-way인 이유는 지금 1, 2, 3 표시한 3가지 커밋을 고려해 merge를 하기 때문이다.

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

✅3-way merge에서 어떤 내용을 반영할 것인지 결정하는 요인

  • case1

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

  • case2

    이 경우에도 base를 기준으로 변화가 발생한 2가 머지 결과가 된다.

  • case3

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

  • case4

    이 경우는 둘 다 base 때와는 다른 변화가 일어났다. 이렇게 두 브랜치에서 모두 변화가 있을 때 Git은 어떤 것을 반영해야 할지 모른다! 바로 이런 경우에 Conflict가 발생한다.

정리

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

4. Rebase & Merge


Rebase를 알아보기 전에 Base가 무엇인지 알아보자.
my-branch 가 main 브랜치의 A 커밋에서 분기되었다고 하자. 이때, my-branch 의 Base는 A 커밋이다.

그렇다면, Rebase는 무엇일까? 말 그대로 Base를 다시 설정한다는 의미이다. 그럼 Base를 어디로 다시 설정할까? my-branch 가 분기된 main 브랜치의 최신 커밋이다.

Rebase를 하면 커밋들의 Base가 변경되므로 Commit Hash 또한 변경 될 수 있다. 이로 인해 Force Push를 해야할 경우도 있으니 주의하자.

$ git checkout my-branch
$ git rebase main
$ git checkout main
$ git merge my-branch


참고 : https://hudi.blog/git-merge-squash-rebase/

0개의 댓글