콘텐츠로 이동

3장: 브랜치 - 평행 우주 만들기

브랜치가 뭔가요?

게임에서 "분기점" 있죠? 선택지에 따라 다른 엔딩으로 가는 것. Git 브랜치도 같은 원리입니다.

메인 코드에 영향을 주지 않고 새로운 기능을 실험할 수 있는 "평행 우주"입니다.

main:     A → B → C → F (병합)
               ↗       ↗
feature:      D → E

왜 브랜치를 쓰나요?

  1. 실험하기: 새 기능을 시도해보고, 망치면 그냥 브랜치를 삭제하면 됨
  2. 협업하기: 팀원끼리 서로 다른 브랜치에서 작업하면 충돌을 줄일 수 있음
  3. 안전하게: main 브랜치는 항상 "작동하는 상태"로 유지할 수 있음

브랜치 기본 명령어

브랜치 확인

# 모든 브랜치 목록
git branch

# 현재 있는 브랜치에 * 표시가 됨
# * main

브랜치 만들기

# 브랜치만 만들기 (이동은 안 함)
git branch feature-login

# 브랜치 만들고 바로 이동하기 (실무에서 더 많이 씀)
git checkout -b feature-login

# 또는 최신 방식
git checkout -b feature-login

브랜치 이동

# 예전 방식 (아직 많이 쓰임)
git checkout main

# 최신 방식 (더 직관적)
git checkout main

브랜치 삭제

# 병합이 끝난 브랜치 삭제
git branch -d feature-login

# 병합 안 했어도 강제 삭제 (주의!)
git branch -D feature-login

브랜치 이름 짓기 (관례)

접두어 용도 예시
feature/ 새로운 기능 개발 feature/login-page
fix/ 버그 수정 fix/header-alignment
hotfix/ 긴급 수정 hotfix/security-patch
docs/ 문서 작업 docs/api-reference
refactor/ 코드 정리 refactor/auth-module

병합(Merge): 평행 우주를 하나로

기본 병합

# 1. main 브랜치로 이동
git checkout main

# 2. feature 브랜치를 main에 병합
git merge feature-login

# 3. 병합 완료된 브랜치 삭제
git branch -d feature-login

병합 시나리오

행복한 케이스: Fast-forward

feature 브랜치에서만 작업하고 main은 변경이 없을 때:

병합 전:  main: A → B
           feature: A → B → C → D

병합 후:  main: A → B → C → D  (그냥 포인터가 앞으로 이동)

일반적인 케이스: 3-way merge

양쪽 다 커밋이 있을 때:

병합 전:  main:     A → B → C
           feature:  A → B → D → E

병합 후:  main:     A → B → C → M (병합 커밋)
                               ↗
                feature:  D → E

충돌(Conflict) 해결하기

두 브랜치에서 같은 파일의 같은 줄을 수정하면 충돌이 발생합니다.

git merge feature-login
# CONFLICT (content): Merge conflict in hello.py

파일을 열어보면:

<<<<<<< HEAD
print("main에서 수정한 내용")
=======
print("feature에서 수정한 내용")
>>>>>>> feature-login

해결 방법: 1. 원하는 내용만 남기고 나머지를 지운다 2. git add로 스테이징 3. git commit으로 병합 완료

# 이런 마커들을 지우고 원하는 코드만 남기기
print("최종적으로 원하는 내용")

브랜치 시각화

# 브랜치 히스토리를 그래프로 보기
git log --oneline --graph --all

# 예시 출력:
# * a1b2c3d (HEAD -> main) Merge branch 'feature-login'
# |\
# | * d4e5f6g (feature-login) add login form
# | * g7h8i9j add auth module
# * | j0k1l2m update homepage
# |/
# * m3n4o5p initial commit

실전 워크플로우

1. main에서 새 브랜치 만들기
   git checkout -b feature/new-feature

2. 그 브랜치에서 작업하기
   # 코드 수정...
   git add .
   git commit -m "add new feature"

3. main으로 돌아와서 병합하기
   git checkout main
   git merge feature/new-feature

4. 브랜치 삭제하기
   git branch -d feature/new-feature

명령어 요약

명령어 역할
git branch 브랜치 목록 보기
git branch <이름> 브랜치 만들기
git checkout <이름> 브랜치 이동
git checkout -b <이름> 브랜치 만들고 이동
git merge <이름> 현재 브랜치에 병합
git branch -d <이름> 브랜치 삭제
git log --oneline --graph --all 브랜치 그래프 보기

checkout vs switch

Git 2.23(2019)에서 checkout의 브랜치 기능이 switch로 분리되었습니다.

명령어 동작
git checkout <브랜치> git switch <브랜치> — 브랜치 이동
git checkout -b <이름> git switch -c <이름> — 브랜치 생성 + 이동

두 명령어는 완전히 같은 동작을 합니다. switch가 더 직관적이지만, checkout이 더 오래 쓰여서 대부분의 자료와 튜토리얼에서 여전히 checkout을 사용합니다.

실습 미션

  1. practice 저장소에서 feature/greeting 브랜치를 만드세요
  2. 그 브랜치에서 hello.py에 새로운 인사말을 추가하고 커밋하세요
  3. main 브랜치로 돌아가서 hello.py에 다른 내용을 추가하고 커밋하세요
  4. feature/greetingmain에 병합하세요 — 충돌이 나면 해결해 보세요
  5. git log --oneline --graph --all로 그래프를 확인하세요

이전 장: 02-git-undo.md 다음 장: 04-git-remote.md - 원격 저장소와 GitHub