6강

브랜치 다루기

3 조회 1

브랜치의 원리와 생성·전환·삭제 방법을 배운다. 브랜치 기반 워크플로우(GitHub Flow, Git Flow)를 이해하고, HEAD 포인터가 어떻게 이동하는지 시각적으로 파악한다.

브랜치 — Git의 핵심 강점

Git에서 브랜치는 매우 가볍습니다. 브랜치는 단순히 특정 커밋을 가리키는 포인터(40바이트 파일)에 불과합니다. 브랜치를 만드는 데 0.1초도 안 걸리고, 수십 개를 만들어도 저장 공간이 거의 늘지 않습니다.

브랜치를 쓰면 현재 안정적인 코드(main)를 건드리지 않고, 독립적인 공간에서 새 기능을 개발하거나 버그를 수정할 수 있습니다.

브랜치와 HEAD의 동작 원리

커밋 이력 예시:
A ← B ← C (main, HEAD)

브랜치 생성:
A ← B ← C (main)
              ↑
           (feature/login)  ← HEAD

feature 브랜치에서 커밋:
A ← B ← C (main)
              ↖
               D ← E (feature/login, HEAD)

→ main은 C에 그대로, feature만 앞으로 이동
→ HEAD는 현재 체크아웃된 브랜치를 가리킴

브랜치 명령어

# 브랜치 목록
git branch          # 로컬 브랜치
git branch -r       # 원격 브랜치
git branch -a       # 전체 (로컬 + 원격)
git branch -v       # 각 브랜치의 최신 커밋

# 브랜치 생성
git branch feature/login

# 브랜치 전환
git checkout feature/login   # 구식 (여전히 작동)
git switch feature/login     # 모던 (Git 2.23+, 권장)

# 생성과 동시에 전환
git checkout -b feature/login
git switch -c feature/login   # 모던

# 특정 커밋/태그에서 브랜치 생성
git switch -c hotfix/bug-42 abc1234
git switch -c release/v1.0 v0.9.0

# 브랜치 이름 변경
git branch -m old-name new-name
git branch -m new-name   # 현재 브랜치 이름 변경

# 브랜치 삭제
git branch -d feature/login    # 병합된 브랜치만 삭제
git branch -D feature/login    # 강제 삭제 (병합 여부 무관)

# 원격 브랜치 삭제
git push origin --delete feature/login

브랜치 네이밍 컨벤션

일반적으로 사용되는 패턴:

main          → 배포 가능한 안정 버전 (구: master)
develop       → 개발 통합 브랜치 (Git Flow에서)

feature/기능명     → 새 기능 개발
  feature/user-auth
  feature/payment-integration
  feature/dark-mode

fix/ or bugfix/    → 버그 수정
  fix/login-error
  bugfix/cart-total-calculation

hotfix/            → 운영 중 긴급 수정
  hotfix/security-patch-2024

release/버전        → 릴리즈 준비
  release/v1.2.0

refactor/          → 리팩터링
docs/              → 문서 작업

GitHub Flow — 가장 단순한 브랜치 전략

소규모 팀과 지속적 배포 환경에 적합합니다.

1. main 브랜치는 항상 배포 가능 상태 유지
2. 작업 시작: main에서 기능 브랜치 생성
   git switch -c feature/new-feature
3. 작업 후 커밋, push
4. Pull Request 생성 → 코드 리뷰
5. 리뷰 통과 → main에 merge
6. 즉시 배포

Git Flow — 릴리즈 주기가 있는 팀

브랜치 구조:
main      → 릴리즈 이력 (태그 포함)
develop   → 개발 통합
feature/* → main 기능 개발 (develop에서 분기)
release/* → 릴리즈 준비 (develop → main)
hotfix/*  → 긴급 수정 (main에서 분기, main+develop에 병합)

흐름:
develop ──── feature/A ──── (병합) ───────────────┐
                                                   ▼
develop ──────────────── release/v1.0 ──── main (v1.0 태그)
                                       ↗
                              최종 QA 여기서

브랜치 체크아웃 시 주의사항

# 수정된 파일이 있으면 브랜치 전환 실패
git switch develop
# error: Your local changes would be overwritten

# 해결 방법 1: 커밋
git add . && git commit -m "WIP: 진행중"

# 해결 방법 2: stash로 임시 저장
git stash
git switch develop
# 다시 돌아와서
git switch feature/login
git stash pop

Detached HEAD 상태

# 특정 커밋을 직접 체크아웃하면 "Detached HEAD" 상태
git checkout abc1234

# HEAD가 브랜치가 아닌 커밋을 직접 가리킴
# 이 상태에서 커밋하면 브랜치 없이 떠다니는 커밋이 됨!

# 확인
git status  # HEAD detached at abc1234

# 해결: 새 브랜치 생성하거나 브랜치로 돌아가기
git switch -c inspect/old-version  # 브랜치로 만들기
git switch main                     # 원래 브랜치로 복귀

관련 검색어  ·  git branch 사용법, git switch checkout, GitHub Flow Git Flow, HEAD 포인터, 브랜치 네이밍, Detached HEAD

채용정보
공지사항
인사이트
MY