[Git] Merge의 다양한 방법

진세오·2025년 6월 28일

Merge

    Merge란 두개의 branch를 하나로 병합하는 것을 말한다. 여기서 말하는 병합이란 2가지의 내용을 하나로 합치는 것을 의미하며, 일반적으로 branch가 삭제되지는 않는다.

Merge의 종류

1. 3-way Merge

    제일 자주 실행하는 merge의 방식이다. 브랜치 a에서 브랜치 b를 머지 하게 되면 새로은 머지커밋이 생기고 a브랜치가 해당 커밋을 가리키게 된다. 이때 a와 b는 동일한 브랜치(공통조상)에서 생성된 브랜치여야 한다. 3-way merge라고 이름 붙여진 이름은 3가지 브랜치가 합쳐지기 때문이다. 1. 기준이 되는 브랜치 2. 병합을 하려고 하는 브랜치 3. 병합이 될 브랜치 총 3개의 브랜치가 합쳐지는데, 이 경우 브랜치들이 전부 다른 모습(커밋)을 가지고 있다.

/* in master branch */

git merge feature15

이미지 참조 : https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%99%80-Merge-%EC%9D%98-%EA%B8%B0%EC%B4%88

    이미지에서 master 브랜치는 '병합의 바탕이 되는 브랜치', feature 15 브랜치는 '병합될 브랜치' 라고 적었지만 두 브랜치 모두 '병합될 브랜치' 이다. 다만 git merge 명령어를 master 브랜치에서 실행했기 때문에 머지 후 만들어지는 커밋을 master 브랜치가 가리킬것이다. 따라서 master 브랜치를 '병합의 바탕이 되는 브랜치' 라고 적었다.


2. Fast-foward Merge

    새로운 머지커밋이 만들어지지 않고 제일 최근 커밋으로 이동하는것을 말한다. 브랜치가 모두 다른 커밋일때 머지가 발생하는 3-way merge와 달리 fast-foward merge는 병합을 하려고 하는 브랜치는 신규 커밋이 없고 병합이 되는 브랜치만 신규 커밋이 있는 상황이다.

3. Squash and Merge

    브랜치에서 생성된 커밋들을 하나의 커밋으로 합쳐서 머지하는 방법이다. --squash [브랜치명] 옵션을 추가해서 사용할 수 있다.

git checkout master
git merge --squash feature15
git commit -m "메세지"




4. Rebase and Merge

    rebase 명령어란 브랜치의 base를 옮긴다는 뜻으로 git branch [브랜치명] 으로 브랜치를 생성했을때 바탕이 되었던 브랜치를 변경한다는 뜻이다. 그림에서 feater15 브랜치는 C2 커밋이 base 이지만, rebase 명령어로 master 브랜치가 있는 C4로 변경할 수 있다. 그 후 merge를 진행하면 fast-foward merge와 결과가 같다.

git checkout feature15
git rebase master


git checkout master
git merge feature15

왜 다양한 merge가 있을까?

    결론은 git log를 깔끔하게 관리하기 위해서 이다. git을 사용하는 이유는 버전관리를 위함도 있지만, 협업을 하기 위해서도 있다. 다양한 사람이 참여하기 때문에 commit로그가 복잡해질것이고, 이 log를 관리하는것도 중요한 요소가 된다. 따라서 rebase, squash 등등의 여러 방법을 통해서 최대한 간결하게 유지하기 위함이다.


참고 사이트

Git 브랜치 - 브랜치와 Merge 의 기초
https://codingapple.com/unit/git-rebase-squash/
https://hudi.blog/git-merge-squash-rebase/
https://velog.io/@kmg2933/Git-Merge-Squash-Rebase-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
https://seosh817.tistory.com/240

0개의 댓글