3장: 브랜치 - 평행 우주 만들기¶
브랜치가 뭔가요?¶
게임에서 "분기점" 있죠? 선택지에 따라 다른 엔딩으로 가는 것. Git 브랜치도 같은 원리입니다.
메인 코드에 영향을 주지 않고 새로운 기능을 실험할 수 있는 "평행 우주"입니다.
main: A → B → C → F (병합)
↗ ↗
feature: D → E
왜 브랜치를 쓰나요?¶
- 실험하기: 새 기능을 시도해보고, 망치면 그냥 브랜치를 삭제하면 됨
- 협업하기: 팀원끼리 서로 다른 브랜치에서 작업하면 충돌을 줄일 수 있음
- 안전하게: 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을 사용합니다.
실습 미션¶
practice저장소에서feature/greeting브랜치를 만드세요- 그 브랜치에서
hello.py에 새로운 인사말을 추가하고 커밋하세요 main브랜치로 돌아가서hello.py에 다른 내용을 추가하고 커밋하세요feature/greeting을main에 병합하세요 — 충돌이 나면 해결해 보세요git log --oneline --graph --all로 그래프를 확인하세요
이전 장: 02-git-undo.md 다음 장: 04-git-remote.md - 원격 저장소와 GitHub