DevOps-Git-04-merge 방법론

SeungWoo Yoo ·2023년 2월 7일
0

1. merge 방법론

브랜치를 합칠 때 다양한 방법으로 합칠 수 있습니다.

  • 3-way merge
  • fast-forward merge
  • rebase and merge
  • squash and merge

2. 3-way merge

브랜치에 각각 신규 commit이 1회 이상 있는 경우 merge 명령을 내리면,
두 브랜치의 코드를 합쳐서 새로운 commit을 자동으로 생성해주는데,
이걸 3-way merge라고 부릅니다. 이게 merge의 기본 동작방식입니다.


3. fast-forward merge

새로운 브랜치에만 commit 이 있고 기준이 되는 브랜치에는 신규 commit 이 없는 경우,
merge 하게 되면 "fast-forward merge 되었습니다" 라고 알려줍니다.

  • fast-forward merge
    • 합칠게 없어서 신규 브랜치의 이름을 "main 브랜치"라고 하는 것
    • "기준이 되는 브랜치에 신규 commit이 없으면" 자동으로 fast-forward merge가 발동됨
    • 싫으면 git merge --no-ff 브랜치명 해서 강제로 3-way merge 할 수도 있음

3.1 브랜치 삭제

3-way, fast-forward 아무렇게나 merge 해도, 브랜치를 merge 하고 나면 브랜치가 자동으로 삭제되진 않습니다.

git branch -d 브랜치이름 # 병합(merge)이 완료된 브랜치 삭제
git branch -D 브랜치이름 # 병합(merge)하지 않은 브랜치 삭제

4. rebase and merge

브랜치를 rebase 하고 나서 merge하는 것도 가능합니다.

rebase는 브랜치의 시작점을 다른 commit으로 옮겨주는 행위입니다.

  1. rebase를 이용해서 신규브랜치의 시작점을 main 브랜치 최근 commit으로 옮긴 다음,
  2. fast-forward merge하는 것

이렇게 하는 이유

  • 3-way merge 말고 강제로 fast-forward 하고 싶을 때
    • 간단하고 짧은 브랜치들은 이거 쓰면 깔끔해보임
  • 단점 : conflict 엔딩 많이 남

일반 3-way merge 대신 rebase & merge 해도 됩니다. 그래서 실제로 rebase and merge 하고 싶으면

  1. 새로운 브랜치로 먼저 이동해서
  2. git rebase main하면 됩니다.
  3. 그럼 브랜치가 main 브랜치 끝으로 이동하는데 그걸 fast-forward merge하면 됩니다.
# reabse & merge 하고 싶으면
git switch 새로운브랜치 # 1. 새로운 브렌치로 이동

# 신규 브랜치의 커밋들을 main 브랜치의 최근의 commit으로 옮김 
git rebase main # 2. git rebase 중심브랜치명

# main 브랜치로 이동해서 fast-forward merge 수행
git switch main
git merge 새로운브랜치

차례로 입력하면 rebase 끝입니다. rebase & merge를 한 줄로 쉽게 비유하자면 강제 fast-forward merge입니다.
직접 새로운 브랜치 만들고 commit 몇 번 하고 rebase 해봅시다.

물론 단점도 있는데, 브랜치끼리 차이가 너무 많은 경우 rebase하면 충돌이 많이 발생해서 해결하기 귀찮음


5. squash and merge

모든 브랜치를 3-way merge 해버리면 나중에 참사가 일어날 수 있습니다.

왜냐면 다음과 같은 현상이 있습니다.

  1. 3-way merge된 것들은 매우 복잡해보임
  2. main 브랜치 git log 출력해보면, 3-way merge된 브랜치들의 commit 내역도 다 같이 출력되어서 더러워짐

이러기 싫으면 rebase아니면 squash and merge하면 됩니다.
새 브랜치에 있던 commit 들을 연결해주는게 아니라 떼와서 main 브랜치에 붙여주기 때문에1번과 2번걱정을 안해도 됨

rebase는 아까 배웠고, squash and merge이거 하면 어떻게 되냐면,
3-way merge처럼 선으로 이어주지 않고, 새 브랜치에 있던 코드 변경사항들이 main 브랜치로 텔레포트합니다.

그럼 이제 main 브랜치의 git log 출력해볼 때, merge 완료된 브랜치의 commit 같은 것들은 출력되지 않습니다.

git switch main
git merge --squash 브랜치명 # squash merge
git commit -m '메세지'

squash and merge하는 법은 그냥 --squash옵션을 추가하면 끝입니다.
브랜치에서 만들어놨던 많은 commit들을 다 합쳐서 하나의 commit으로 main 브랜치에 생성해줍니다.


6. 결론

merge를 잔뜩 해놓으면 나중에 git log 그래프가 매우 복잡해질 수 있습니다.
그게 싫으면 squash해보십시오. 또는 rebase 해도 마찬가지로 해결가능합니다.
보통 회사 프로젝트마다, 브랜치마다 merge 방법 가이드라인이 있습니다.

profile
Front-end 공부 중... 책 읽는 걸 좋아합니다.

0개의 댓글