모든 강의를 무료로 볼 수 있어요. 회원가입 없이도 학습 가능합니다.

8강 / 전체 12강

merge

8분 읽기 조회 0

git merge로 브랜치 통합, Fast-forward merge와 3-way merge 차이점, merge commit 생성 원리, --no-ff 옵션으로 히스토리 보존, 머지 후 브랜치 정리까지 브랜치 통합의 모든 것을 익힙니다.

🎯 학습 목표

이 강을 마치면 다음을 할 수 있습니다.

  • git merge로 다른 브랜치의 변경 사항을 현재 브랜치에 통합할 수 있습니다.
  • Fast-forward merge와 3-way merge의 차이를 이해하고 구분할 수 있습니다.
  • --no-ff 옵션으로 merge commit을 강제 생성하는 이유를 설명할 수 있습니다.
  • 머지 후 불필요한 브랜치를 정리하는 절차를 알고 있습니다.

🔀 git merge — 브랜치 통합의 기본

이 섹션에서는 git merge의 기본 사용법과 실행 흐름을 살펴보겠습니다.

Merge는 다른 브랜치에서 이루어진 작업을 현재 브랜치로 가져와 합치는 명령어입니다. 기능 개발 브랜치에서 작업을 완료하면 최종적으로 main 브랜치에 merge해서 통합합니다.

Merge의 방향을 명확히 이해해야 합니다. git merge feature-login을 실행하면 현재 브랜치에 feature-login을 가져오는 것입니다. 그러므로 feature-login을 main에 합치려면 먼저 main 브랜치로 이동해야 합니다.

# 기본 merge 흐름
# 1. 합칠 목적지 브랜치로 이동
git switch main

# 2. 가져올 브랜치를 merge
git merge feature-login

# 출력 예시 (fast-forward):
# Updating a1b2c3d..d4e5f6g
# Fast-forward
#  login.html | 50 ++++++++++++++++++++++++
#  1 file changed, 50 insertions(+)
#  create mode 100644 login.html

⚡ Fast-forward Merge

이 섹션에서는 가장 단순한 형태의 머지인 Fast-forward merge가 어떤 상황에서 발생하고 어떻게 동작하는지 살펴보겠습니다.

Fast-forward merge는 main 브랜치가 feature 브랜치가 분기한 이후 한 번도 새 커밋을 받지 않은 경우 발생합니다. 이 경우 Git은 별도의 merge commit을 만들지 않고 main 포인터를 feature 브랜치의 최신 커밋으로 "빨리감기"합니다.

# Fast-forward가 발생하는 상황:
# main: A -- B -- C
#                  # feature:          D -- E
#
# git merge feature 후:
# main: A -- B -- C -- D -- E  (포인터만 이동, 새 커밋 없음)

# 확인 방법 (FF 여부는 출력에 'Fast-forward' 문구로 알 수 있음)
git log --oneline --graph
# * e7f8g9h (HEAD -> main, feature-login) feat: 로그인 에러 메시지 개선
# * d4e5f6g feat: 비밀번호 찾기 기능 추가
# * c3d4e5f feat: 로그인 UI 완성
# * a1b2c3d 이전 main 커밋

Fast-forward merge는 히스토리가 깔끔하게 선형으로 유지되는 장점이 있습니다. 그러나 "어느 커밋이 어느 브랜치에서 온 것인지"의 정보가 히스토리에서 사라진다는 단점도 있습니다.

🔀 3-way Merge

이 섹션에서는 두 브랜치가 각자 진행된 경우 Git이 어떻게 두 변경 사항을 하나로 합치는지 살펴보겠습니다.

3-way merge는 main 브랜치와 feature 브랜치가 분기한 이후 각각 새 커밋이 있을 때 발생합니다. Git은 세 가지 커밋을 참고합니다.

  1. 두 브랜치의 공통 조상(Merge Base): 분기한 시점의 커밋
  2. main의 최신 커밋
  3. feature의 최신 커밋

이 세 지점을 비교해 자동으로 변경 사항을 합치고, 새로운 merge commit을 생성합니다.

# 3-way merge 발생 상황:
# main:    A -- B -- C -- F  (main에도 새 커밋 F가 있음)
#                    # feature:            D -- E
#
# git merge feature 후:
# main:    A -- B -- C -- F -- M  (M이 merge commit)
#                           /
# feature:            D -- E

# merge commit을 자동으로 생성하며, 기본 에디터로 커밋 메시지 편집 요청
# 기본 메시지: "Merge branch 'feature-login'"
# 메시지 수정 후 저장·종료하면 merge 완료

# 에디터 없이 기본 메시지로 바로 merge
git merge feature-login --no-edit

merge commit은 부모가 두 개인 특수한 커밋입니다. git log --graph로 보면 두 줄기가 합쳐지는 형태가 시각적으로 표현됩니다.

🔧 --no-ff 옵션 — merge commit 강제 생성

이 섹션에서는 Fast-forward 상황에서도 merge commit을 만들어 히스토리에 브랜치 흔적을 남기는 방법을 살펴보겠습니다.

Fast-forward가 가능한 상황이라도 --no-ff(no fast-forward) 옵션을 사용하면 merge commit을 강제로 생성합니다. 팀에서 "이 작업이 어느 브랜치에서 왔는가"를 히스토리에 명확히 기록하고 싶을 때 사용합니다.

# --no-ff로 merge commit 강제 생성
git merge --no-ff feature-login

# --no-ff 없이 (Fast-forward):
# A -- B -- C -- D -- E  (선형, 브랜치 흔적 없음)

# --no-ff 있을 때:
# A -- B -- C --------- M  (M = merge commit, 브랜치 흔적 보존)
#                      /
#             D -- E ---
옵션merge commit 생성히스토리 형태사용 상황
기본 (FF 가능시) 없음 선형 (깔끔) 개인 프로젝트, 간단한 작업
--no-ff 항상 생성 분기 흔적 보존 팀 협업, 기능 단위 추적 필요시
기본 (FF 불가시) 자동 생성 분기 흔적 보존 양쪽 브랜치가 각자 진행된 경우

🧹 머지 후 브랜치 정리

이 섹션에서는 성공적으로 merge된 브랜치를 정리하고 저장소를 깔끔하게 유지하는 방법을 살펴보겠습니다.

merge가 완료된 브랜치는 더 이상 필요 없습니다. 오래된 브랜치를 그대로 두면 git branch 목록이 지저분해지고 혼란이 생깁니다.

# merge된 브랜치 목록 확인
git branch --merged

# merge된 브랜치 삭제 (안전 — 병합된 것만 삭제)
git branch -d feature-login

# merge 후 전체 정리 흐름
git switch main
git merge --no-ff feature-login
git branch -d feature-login   # 로컬 브랜치 삭제
# (원격 브랜치가 있다면)
git push origin --delete feature-login  # 원격 브랜치 삭제

# 현재 상태 확인
git log --oneline --graph --all -10

GitHub 등 원격 저장소에서 Pull Request를 통해 merge하면 보통 UI에서 "브랜치 삭제" 버튼이 제공됩니다. 원격 브랜치는 거기서 삭제하고, 로컬에서는 git branch -d로 정리하는 것이 일반적인 워크플로입니다.

📝 핵심 요약

8강에서 배운 내용을 정리해 보겠습니다.

# 오늘의 핵심 명령어

git switch main              # 합칠 목적지 브랜치로 이동
git merge 브랜치명            # 브랜치 통합
git merge --no-ff 브랜치명   # merge commit 강제 생성
git merge 브랜치명 --no-edit  # 기본 메시지로 바로 merge
git branch --merged          # 병합된 브랜치 목록
git branch -d 브랜치명        # 병합된 브랜치 삭제
merge 유형발생 조건merge commit
Fast-forwardmain에 새 커밋 없음없음 (포인터만 이동)
3-way merge양쪽에 각자 새 커밋자동 생성
--no-ffFF 가능해도 강제항상 생성

다음 강인 9강 — 충돌 해결에서는 같은 파일의 같은 줄을 두 브랜치에서 동시에 수정할 때 발생하는 merge conflict(충돌)를 해결하는 방법을 배웁니다. 충돌은 협업에서 가장 당황스러운 순간이지만, 원리를 알면 두렵지 않습니다!

관련 주제

  • git merge
  • Fast-forward merge
  • 3-way merge
  • merge commit
  • --no-ff 옵션
  • 브랜치 정리
  • 개발·프로그래밍
  • 개발·프로그래밍 강의
  • 깃허브 사용법 18강 — Git & GitHub 협업
  • 무료강의
  • 무료 온라인 강의
  • NUGUNA
  • 누구나

📚 시리즈 전체 공유

깃허브 사용법 18강 — Git & GitHub 협업

이 강의가 속한 시리즈는 총 12강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.

댓글

0/1000

불러오는 중...