다양한 Merge유형 ( 3-way, fast-forward, rebase, squash )

방충림·2023년 3월 28일
4

Git & GitHub

목록 보기
4/8
post-thumbnail
post-custom-banner

3-way merge

브랜치마다 신규 커밋이 하나 이상 있는 경우. 새로운 커밋을 생성하면서 합쳐준다. 이러한 유형을 3-way merge라고 한다.


fast-forward merge

메인브랜치에 신규 커밋이 없는 경우. 그냥 브랜치의 최신 커밋을 main브랜치로 하기로 한다. 이러한 유형을 fast-forward merge이라고 한다.

merge 방식 강제 변경

fast-forward merge되는 게 싫으면, git merge —no-ff 브랜치명을 사용해서 강제로 3-way merge를 할 수도 있다.

git merge —no-ff 브랜치이름 // fast-forward merge 될 것을 강제로 3-way-merge

rebase

  • rebase 라는명령어를 써서도 merge할 수 있다.
  • rebase는 브랜치의 시작점을 다른 commit으로 옮겨주는 행위이다.
    1. rebase를 이용해서 신규브랜치의 시작점을 main 브랜치의 최근 commit으로 옮긴 다음
    2. fast-forward merge하는 것이다.


브랜치의 원래 시작점은 commit2인데, commit3로 바꿔주었다.

왜 이런 방법을 사용하는가?

: rebase를 쓰는 이유는 만약 브랜치가 1000개 정도 되는데 모두 3-way-merge를 해버리면 git log를 출력해보았을 때 너무 복잡해지기 때문에, 간단한 브랜치들은 rebase를 하는 경우가 많다. 이렇게 할 경우 훨씬 깔끔해보인다.

단점은 브랜치끼리 차이가 너무 많은 경우 conflict가 많이 발생할 수 있다.

rebase 명령어 사용법

git switch 새로운브랜치
git rebase main

git switch main
git merge 새로운브랜치

(중요) 3-way merge와 rebase&merge 명령어 실행 위치!!


squash and merge

squash and merge는 순간이동에 비유할 수 있다. 기존의 브랜치는 흔적까지 모두 없애고, 중심 브랜치에 새로운 커밋을 하나 생성해주는 것이다.

3-way merge를 다 해버리면 main브랜치의 gitl log를 출력해봤을 때, 자잘한 커밋들 메시지도 출력이 되는 것들을 볼 수 있다.

그렇게 되지 않으려면 중간의 연결되는 선을 끊어주면 되는데, 이것을 해주는 것이 Squash and merge이다.

그림으로 표현하자면 아래와 같이 되어 사이드 브랜치에서 개발했던 자잘한 로그들이 출력이 되지 않는다.

왜 이런 방법을 사용하는가?

3-way merge를 남발하게되면 commit 내역들이 나중에 매우 더럽고, 복잡해보인다.
main 브랜치 git log를 출력해보면 3-way merge된 브랜치들의 commit 내역도 다 같이 출력되어있을 것이다.

rebase 명령어 사용법

git switch main
git merge --squash 브랜치명 
// 브랜치에서 만들어놨던 많은 commit 을 다 합쳐서 하나의 commit으로 main 브랜치에 생성함
git commit -m '메세지'


참고문헌 : 코딩애플

profile
최선이 반복되면 최고가 된다.
post-custom-banner

0개의 댓글