개발을 하다보면 하나의 페이지에서 여러 가지 기능을 구현하거나
새로운 기능을 추가하고 이전의 내용과 비교해야 할 일이 자주 있는데
그럴 때 유용한 branch와 merge에 대해 알아볼 것이다.
git branch
우선 branch는 프로그램에 새로운 기능을 추가할 때 만들어지는 복사본 개념이다.
branch의 뜻인 나뭇가지라는 말 그대로 원본에서 복사본이라는 가지를 쳐서 작업하는 것이다.
이런식으로 복사본을 만들어 작업을 하면 원본을 훼손하지 않고 안전하게 작업할 수 있다
git branch 브랜치이름
이러면 브랜치가 하나 생성된다.
git switch 브랜치이름
git switch main
다른 branch로 이동하고 싶다면 이렇게 하면 되고
원본 브랜치으로 돌아가고 싶으면 git switch main(or master) 하면 된다
git status
내가 지금 어디 브랜치인지 모르겠다면 git status로 확인가능하다
git merge
생성한 branch에서 작업이 완료되어 main branch로 적용시키고 싶을 때 merge를 사용한다
git switch main
git merge 브랜치명
merge를 하기 위해서는 우선 기준이되는 브랜치로 이동시켜야한다
git switch main을 입력 후 merge를 해주어야 한다
git merge 주의사항
만약 이 때 main의 내용과 branch의 내용에서 같은 파일, 같은 줄을 수정했다면
merge를 했을 때 conflict(충돌)이 발생하게 된다
이렇게 됐을 때는 수동으로 직접 우리가 어떤 내용을 남길건지 선택해주고
add, commit 해주면 해결된다
merge의 4가지 종류
1. 3-way merge
흔히 아는 가장 기본이 되는 merge 방법이다
main 브랜치와 새로운 브랜치에 각각 1회 이상 commit이 있을 경우 merge를 했을 때
3-way merge라고 한다
병합 커밋은 자동으로 생성된다

2. fast-forward merge
main 브랜치에는 새로운 브랜치를 만든 이후 신규 commit이 없고
새로운 브랜치에는 commit이 있을 경우 merge 했을 때를
fast-forward merge라고 부른다

main에서는 변동사항이 없으니 합치고 뭐 할것도 없이
그냥 일자로 된다고 보면 된다. 새로운 브랜치가 new이자 main브랜치가 되는 것이다
병합 커밋도 생기지 않는다
이 merge 방법의 장점은 시각적으로 좀 더 복잡해보이는 것을 완화시켜준다.
이 방법이 싫다면
git merge --no --ff 브랜치명
이렇게 해서 강제로 3-way merge를 해줄 수도 있다.
+) 참고로 merge를 한다고 해서 병합된 branch가 삭제되는 것은 아니다
삭제하고 싶다면
git branch -d 브랜치이름 // 병합 완료된 브랜치 삭제
git branch -D 브랜치이름 // 병합 안된 브랜치 삭제
이렇게 해주면 된다
3. rebase merge
rebase merge는 강제 fast-forward merge 느낌인데
우선 rebase는 새로운 브랜치의 시작점을 main 브랜치의 가장 최근 commit으로 옮겨주는 행위다

그 후 merge를 해주면 fast-forward merge가 되는데
이것을 rebase merge라고 한다

사용하는 이유는 3-way merge가 아닌 fast-forward merge를 하고 싶을 때 강제로 가능하다
또한 시각적으로 복잡성이 완화되고 commit 내역을 한 줄로 이어나가고 싶을 때 사용한다
사용하는 방법은
git swtich 새로운브랜치
git rebase main
일반적인 merge 방식과 다르게 새로운 브랜치로 switch한 후 main을 rebase한다
그리고
git switch main
git merge 새로운브랜치
이런식으로 해주면 fast-forward merge가 발생하게 된다
그러므로 병합커밋도 생성되지 않는다
단점으로는 conflict가 발생하기 쉽다는 것이다
4. squash merge
모든 branch를 3-way merge로 한다면 시각적으로 굉장히 보기 불편해진다
또한 main 브랜치의 git log 출력 시 연결된 브랜치들의 commit 내역도 함께 보여주기에
git log 그래프가 더러워진다
이를 해결하기 위해서는 rebase merge 또는 squash merge를 사용해야한다
squash merge는 연결 선이 안생기는 3-way merge라고 생각하면되는데
squash merge는 새로운 브랜치의 내용들이 main 브랜치에 선으로 연결되는 것이 아닌
무선으로 텔레포트 된다고 생각하면 쉽다

사용하는 방법은
git switch main
git merge --squash 브랜치명
git commit -m '메세지'
이렇게 해주면 된다
squash merge를 하게되면 작업 내용만 순간이동 되고
merge commit(병합커밋)은 자동으로 해주지 않기에 반드시 직접 해줘야 한다
rebase merge와 squash merge의 차이로는
rebase merge는 합쳐질 브랜치의 commit 내역이 전부 보존되어 합쳐지지만
squash merge는 합쳐질 브랜치의 commit 내역이 하나로 합쳐져 기준 브랜치에 합쳐진다
위의 두 merge를 설명한 사진을 보면 이해가 바로 될 것이다
참고로 3-way merge는 합쳐질 때 commit 내역이 보존된다
merge에 생각했던 것보다 다양한 방식이 있다는 것에
공부하면서 배워갈 것이 많아 의미있었고
branch가 많아지면 많아질수록 어떤 merge를 사용해야 할 지에 대한
판단을 잘해야 할 것 같다는 생각이 들었다
이 글은 강의 내용을 보고 공부한 것을 정리한 글입니다
'git & github' 카테고리의 다른 글
| [git & github] git이랑 친해지기 ④ (git flow, Trunk-based 전략) (0) | 2025.10.08 |
|---|---|
| [git & github] github랑 친해지기 (0) | 2025.10.07 |
| [git & github] git이랑 친해지기 ③ (git restore, git revert, git reset) (0) | 2025.10.06 |
| [git & github] git이랑 친해지기 ① (git add, git commit, git diff) (0) | 2025.10.04 |
