이 영역을 누르면 첫 페이지로 이동
Daily Growth 블로그의 첫 페이지로 이동

Daily Growth

페이지 맨 위로 올라가기

Daily Growth

Loving you is the reason I live. That’s why every day is precious, a step toward my dreams and you.

Git 병합 방식 : Fast-forward, 3-way, Rebase, Cherry-pick

  • 2025.07.09 13:10
  • IT

Git 병합 방식

📚 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

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 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
다른 글 더 둘러보기

정보

Daily Growth 블로그의 첫 페이지로 이동

Daily Growth

  • Daily Growth의 첫 페이지로 이동

검색

메뉴

    카테고리

    • 분류 전체보기 (470)
      • Design History (69)
      • IT (170)
      • Typography (13)
      • UX • UI Design (11)
      • Money (62)
      • Health (53)
      • Words (6)
      • Reading (21)
      • English (64)

    나의 외부 링크

    • Daily Growth
    • Daily World
    • lody.design
    • lody.diary

    정보

    self-improvement의 Daily Growth

    Daily Growth

    self-improvement

    블로그 구독하기

    • 구독하기
    • 네이버 이웃 맺기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. Copyright © self-improvement.

    티스토리툴바