브랜치 & Merge
브랜치로 독립적인 작업 공간을 만들고, Merge로 합치는 Git의 핵심 협업 기능을 배웁니다.
- 브랜치를 생성하고 전환할 수 있다
- Fast-forward와 3-way Merge의 차이를 이해한다
- Merge 충돌을 직접 해결할 수 있다
- 실무 브랜치 네이밍 컨벤션을 안다
1. 브랜치란?
브랜치는 독립적인 작업 공간입니다. 메인 코드에 영향을 주지 않고 새 기능을 개발하거나 버그를 수정할 수 있습니다.
구분이 안 됨
주요 브랜치 명령어
# 브랜치 목록 확인 (* = 현재 브랜치)
$ git branch
* main
feature/login
# 새 브랜치 생성
$ git branch feature/login
# 브랜치 전환
$ git switch feature/login
# 생성 + 전환 한 번에
$ git switch -c feature/login
# 브랜치 삭제 (merge 완료 후)
$ git branch -d feature/login
브랜치 네이밍 컨벤션
| 접두사 | 용도 | 예시 |
|---|---|---|
feature/ |
새 기능 개발 | feature/login, feature/dark-mode |
fix/ |
버그 수정 | fix/login-error, fix/typo |
hotfix/ |
긴급 운영 수정 | hotfix/critical-bug |
docs/ |
문서 작업 | docs/api-guide |
2. Merge — 브랜치 합치기
① Fast-forward Merge
두 브랜치 중 한쪽이 다른 쪽의 직계 후손일 때, 포인터만 이동하여 병합합니다.
# feature/login 브랜치 생성 및 작업
$ git switch -c feature/login
$ touch login.html
$ git add .
$ git commit -m "feat: 로그인 페이지 추가"
# main으로 이동 후 merge
$ git switch main
$ git merge feature/login
Updating a3f82bc..c7d3e9f
Fast-forward
login.html | 0
1 file changed, 0 insertions(+), 0 deletions(-)
# merge 완료 → 브랜치 삭제
$ git branch -d feature/login
② 3-way Merge
두 브랜치가 각자 다른 커밋을 가지고 있을 때, 공통 조상을 기준으로 새 merge commit이 생성됩니다.
③ Merge 충돌(Conflict) 해결
두 브랜치가 같은 파일의 같은 줄을 다르게 수정했을 때 충돌이 발생합니다.
$ git merge feature/login
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit.
# 충돌 파일 수정 후 add + commit
$ git add index.html
$ git commit -m "merge: feature/login 충돌 해결 후 병합"
git branch
git switch -c 브랜치명
git switch 브랜치명
git merge 브랜치명
git branch -d 브랜치명
이론에서 배운 Fast-forward와 3-way Merge, 충돌 실습을 한 번씩 직접 해보는 2가지 미션입니다.
브랜치 실습용 폴더를 만들고 첫 커밋을 만들어 둥니다.
$ mkdir branch-practice && cd branch-practice
$ git init && touch index.html
$ git add . && git commit -m "feat: index.html 추가"
이론의 SVG처럼, main에서 분기해 독립적으로 커밋합니다.
$ git switch -c feature/about
$ touch about.html
$ git add . && git commit -m "feat: about 페이지 추가"
main에 없던 about.html이 생깁니다! 이론의 "포인터만 이동" SVG를 참고하세요.
$ git switch main
$ ls
index.html ← about.html 없음!
$ git merge feature/about
Fast-forward
about.html | 0
1 file changed
$ ls
about.html index.html ← 넡!
$ git branch -d feature/about
충돌 조건 만들기: main에서 index.html을 먼저 수정합니다.
$ echo "<h1>안녕하세요</h1>" > index.html
$ git add . && git commit -m "fix: 헤더 한국어로"
이론의 3-way Merge 조건입니다! 같은 파일의 같은 줄을 서로 다르게 수정하는 상황을 만들거니다.
$ git switch -c feature/header
$ echo "<h1>Hello World</h1>" > index.html
$ git add . && git commit -m "feat: 헤더 영어로"
main으로 돌아가 merge하면 충돌이 납니다. 이론의 <<<<<<< / ======= / >>>>>>> 마커를 눈으로 확인하세요!
$ git switch main
$ git merge feature/header
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit.
$ cat index.html
<<<<<<< HEAD
<h1>안녕하세요</h1>
=======
<h1>Hello World</h1>
>>>>>>> feature/header
이론의 충돌 파일 다이어그램과 동일한 상황입니다! <<<,===,>>> 표시를 모두 제거하고 원하는 내용만 남기세요.
충돌 마커를 제거하고 원하는 내용만 남기세요. 그리고 add + commit으로 충돌 해결 커밋을 만들어독니다.
# index.html을 에디터로 열어 충돌 마커 제거 및 저장
$ git add index.html
$ git commit -m "merge: feature/header 충돌 해결"
$ git log --oneline --graph
* 9f8e3d1 merge: feature/header 충돌 해결
|\
| * 7b3c1d0 feat: 헤더 영어로
* | 2f4a8e9 fix: 헤더 한국어로
|/
* a3f82bc feat: index.html 추가
git switch feature 했는데 "Your local
changes would be overwritten" 오류가 나요동일 파일에 변경사항이 있고, 두 브랜치가 서로 다른 버전을 가지고 있는 경우입니다.
커밋하거나 git stash로 임시 저장 후 전환하세요.
main에서 브랜치 없이 커밋한 상황입니다.
git reset --soft HEAD~1로 커밋을 취소하고, 새 브랜치를 만들어서
다시 커밋하세요.
브랜치 이름은 나중에 바꿀 수 있습니다.
git branch -m 앞이름 새이름으로 변경하세요.
merge 전 diff 확인이 가능합니다.
git diff main feature/xxx로 두 브랜치의 차이를 미리 확인할 수
있습니다.