Git 병합 방식 : Fast-forward, 3-way, Rebase, Cherry-pick
📚 Git 병합 방식 정리
Fast-forward vs 3-way merge + Rebase + Cherry-pick + Rebase --onto + merge --squash + Gitflow
✅ Git 병합이란?
Git에서 브랜치(branch) 는 독립적인 작업 흐름이다.
이 브랜치들을 다시 합치는 과정을 병합(Merge) 이라고 한다.
병합에는 크게 두 가지 방식이 있다:
✔️ Fast-forward merge
✔️ 3-way merge
그리고 자주 헷갈리는 Rebase, Cherry-pick,
브랜치 구조를 마음껏 바꿀 수 있는 Rebase --onto,
여러 커밋을 하나로 합치는 merge --squash,
효율적인 협업 전략 Gitflow 까지 함께 정리해보았다🥰.
1️⃣ Fast-forward 병합
Fast-forward 병합은 두 브랜치에 갈라짐이 없을 때 발생한다.
즉, 병합 대상 브랜치가 현재 브랜치의 직계 조상이라면
브랜치 포인터만 앞으로 이동하면 된다.
📌 특징: 별도의 병합 커밋이 생기지 않는다!
ex.
A --- B --- C (main)
\
(feature)
- feature는 main의 C 커밋에서 새로 파생되었지만 아무 변경도 없음.
- 즉 feature는 main의 복사본.
git switch feature
git merge main
- feature가 C를 가리키고 있으므로 그냥 포인터만 앞으로 이동.
- 병합 커밋 없이 끝!
2️⃣ 3-way merge
3-way merge는 브랜치가 갈라진 뒤 각자 다른 커밋을 쌓았을 때 사용한다.
공통 조상을 기준으로 두 브랜치의 변경사항을 비교해 새로운 병합 커밋을 만든다.
왜 3-way?
공통 조상(Base) + 현재 브랜치(HEAD) + 병합 대상(Other) → 3개 스냅샷 비교!
ex.
A --- B --- C (main)
\
D --- E (feature)
- 공통 조상: B
- main은 C까지.
- feature는 D, E가 있음.
git switch main
git merge feature
- Git은 B를 기준으로 B➜C와 B➜E를 비교.
- 둘을 합쳐서 병합 커밋 M을 만든다.
A --- B --- C ------- M (main)
\ /
D --- E ------ (feature)
✔️ M은 부모가 두 개(C, E)인 병합 커밋이다.
3️⃣ Rebase
Rebase는 병합과 비슷하지만 갈라진 브랜치를 다른 브랜치 위로 다시 붙여서 새 커밋으로 만든다.
히스토리를 직선으로 정리할 수 있다.
ex. (같은 상황)
A --- B --- C (main)
\
D --- E (feature)
git switch feature
git rebase main
- 공통 조상 B를 기준으로 D, E를 떼어 C 뒤에 새로 붙인다.
- 원본 D, E와 동일한 내용이지만 커밋 ID는 다르다.
A --- B --- C --- D' --- E' (feature)
✔️ 병합 커밋 없음!
히스토리가 한 줄로 깔끔해진다.
4️⃣ Cherry-pick
Cherry-pick은 특정 커밋만 골라 다른 브랜치에 복사해 적용한다.
ex.
A --- B --- C (main)
\
D --- E (feature)
feature의 E만 main에 가져오고 싶다면?
git switch main
git cherry-pick E
A --- B --- C --- E' (main)
\
D --- E (feature)
✔️ E'는 E와 내용은 같지만 커밋 ID는 다르다.
✔️ 병합 커밋 없이 원하는 커밋만 가져올 수 있다.
5️⃣ Rebase --onto
rebase --onto 는 브랜치를 복잡한 구조에서 원하는 곳으로 옮길 때 사용한다.
기존 브랜치를 떼어내어 다른 브랜치 위로 붙인다.
ex.
A --- B --- C (main)
\
D --- E (fruit)
\
F --- G (citrus)
- citrus는 fruit에서 파생된 브랜치다.
- citrus를 main 위로 옮기고 싶다면?
git switch citrus
git rebase --onto main fruit citrus
결과:
A --- B --- C --- F' --- G' (citrus)
\
D --- E (fruit)
✔️ fruit에서 파생된 citrus의 F, G가 main 위로 새로 붙음.
6️⃣ merge --squash
merge --squash 는 여러 커밋을 하나로 합쳐서 병합할 때 사용한다.
ex.
A --- B --- C (main)
\
D --- E --- F (root)
- root 브랜치의 D, E, F를 하나로 합쳐 main에 반영하고 싶다면?
git switch main
git merge --squash root
git commit -m "Squash merge root"
결과:
A --- B --- C --- S (main)
\
D --- E --- F (root)
✔️ S는 D, E, F의 내용을 포함한 새 커밋.
✔️ 병합 커밋 없이 기록 깔끔!
7️⃣ checkout vs switch
명령어 | 설명 |
git checkout | 예전부터 쓰이던 만능 명령어. 브랜치 전환, 파일 복원 등 |
git switch | 브랜치 전환 전용. 더 직관적이고 안전 |
👉 요즘은 git switch 추천!
👉 새 브랜치 만들 땐 git switch -c <브랜치명>
8️⃣ 협업을 위한 Gitflow
Gitflow는 역할별 브랜치 전략으로 협업을 체계화한다.
- main : 배포(릴리즈) 버전.
- develop : 다음 릴리즈 준비.
- feature : 기능 개발용 브랜치, develop에서 파생.
- release : 배포 전 테스트, develop에서 파생.
- hotfix : 긴급 수정, main에서 바로 파생.
✔️ 작업 흐름을 나눠서 충돌 최소화!
✔️ 안정적인 배포와 테스트 가능🖤
비교✨
Fast-forward | 3-way merge | Rebase | Cherry-pick | Rebase --onto | merge --squash | |
원리 | 포인터만 이동 | 공통 조상 기준 3-way 비교 | 공통 조상 기준 재적용 | 특정 커밋 복사 | 브랜치 일부 떼어 새로 붙임 | 여러 커밋을 하나로 합침 |
병합 커밋 | 없음 | 있음 | 없음 | 없음 | 없음 | 없음 |
히스토리 | 직선 | 갈래 | 직선화 | 선택 복사 | 구조 변경 | 히스토리 간결화 |
커밋 ID | 유지 | 유지 | 새로 생성 | 새로 생성 | 새로 생성 | 새로 생성 |
요약정리:)
- Fast-forward: 포인터만 이동
- 3-way merge: 공통 조상 기준 새 병합 커밋
- Rebase: 갈라진 커밋 새로 복붙해 직선화
- Cherry-pick: 원하는 커밋만 선택 복사
- Rebase --onto: 브랜치 일부 떼어 다른 브랜치로 이동
- merge --squash: 여러 커밋을 하나로 압축
- Gitflow: 역할별 브랜치로 협업 최적화
'IT' 카테고리의 다른 글
Git Hooks, gitmoji-cli, 서브모듈, 그리고 README.md (0) | 2025.07.15 |
---|---|
실무에서 바로 써먹는 Git 고급 사용법 & 설정 꿀팁 총정리 (2) | 2025.07.10 |
Git 실수해도 걱정 없는 이유: git clean, restore, reflog, tag (2) | 2025.07.08 |
Git amend와 rebase로 커밋 다루기 (1) | 2025.07.08 |
Git Stash 적용과 Pop 차이 그리고 활용법 (1) | 2025.07.07 |
댓글
이 글 공유하기
다른 글
-
Git Hooks, gitmoji-cli, 서브모듈, 그리고 README.md
Git Hooks, gitmoji-cli, 서브모듈, 그리고 README.md
2025.07.15 -
실무에서 바로 써먹는 Git 고급 사용법 & 설정 꿀팁 총정리
실무에서 바로 써먹는 Git 고급 사용법 & 설정 꿀팁 총정리
2025.07.10 -
Git 실수해도 걱정 없는 이유: git clean, restore, reflog, tag
Git 실수해도 걱정 없는 이유: git clean, restore, reflog, tag
2025.07.08 -
Git amend와 rebase로 커밋 다루기
Git amend와 rebase로 커밋 다루기
2025.07.08