[GitHub 100일 챌린지] Day 44 - 각 브랜치에서 작업
[GitHub 100일 챌린지] Day 44 - 각 브랜치에서 작업
100일 챌린지 Day 44 - 여러 브랜치를 오가며 독립적으로 작업하는 방법을 배웁니다.
배울 내용
- 브랜치별 독립적인 작업
- 여러 브랜치 동시 관리
- 브랜치 작업 실전 워크플로우
Topic1. 브랜치별 독립적인 작업
각 브랜치는 완전히 독립적인 작업 공간입니다.
브랜치 독립성 이해하기
시나리오: 웹사이트에 로그인과 결제 기능 동시 개발
gitGraph
commit id: "Initial v1.0"
branch feature/login
branch feature/payment
checkout feature/login
commit id: "Login form"
commit id: "Auth logic"
checkout feature/payment
commit id: "Payment API"
commit id: "Payment UI"
checkout main
commit id: "main 유지"
각 브랜치의 파일 구성이 다릅니다:
main: 기본 파일만feature/login: 기본 + login.html, auth.jsfeature/payment: 기본 + payment.html, stripe.js
해보기: 독립적인 작업 공간 만들기
프로젝트 설정:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 새 프로젝트 시작
mkdir multi-feature-project
cd multi-feature-project
git init
# 기본 파일 구성
echo "# My Website" > README.md
echo "<!DOCTYPE html>" > index.html
git add .
git commit -m "Initial project structure"
# 현재 파일 확인
ls
# 출력: README.md index.html
Feature 1: 로그인 기능:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 로그인 브랜치 생성 및 전환
git checkout -b feature/login-system
# 로그인 파일 생성
cat > login.html << 'EOF'
<!DOCTYPE html>
<html>
<head><title>Login</title></head>
<body>
<form id="loginForm">
<input type="email" placeholder="Email">
<input type="password" placeholder="Password">
<button>Login</button>
</form>
</body>
</html>
EOF
cat > auth.js << 'EOF'
function login(email, password) {
// 로그인 로직
console.log('Logging in...');
return fetch('/api/auth', {
method: 'POST',
body: JSON.stringify({ email, password })
});
}
EOF
# 커밋
git add login.html auth.js
git commit -m "feat: Add login form and authentication"
# 파일 확인
ls
# 출력: README.md index.html login.html auth.js
Feature 2: 결제 기능 (완전 독립적!):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# main으로 돌아가기
git checkout main
# 파일 확인
ls
# 출력: README.md index.html (login 파일들 없음!)
# 결제 브랜치 생성
git checkout -b feature/payment-gateway
# 결제 파일 생성
cat > payment.html << 'EOF'
<!DOCTYPE html>
<html>
<head><title>Payment</title></head>
<body>
<form id="paymentForm">
<input type="text" placeholder="Card Number">
<input type="text" placeholder="CVV">
<button>Pay Now</button>
</form>
</body>
</html>
EOF
cat > stripe.js << 'EOF'
function processPayment(cardInfo) {
// 결제 처리 로직
console.log('Processing payment...');
return stripe.createToken(cardInfo);
}
EOF
# 커밋
git add payment.html stripe.js
git commit -m "feat: Add payment form and Stripe integration"
# 파일 확인
ls
# 출력: README.md index.html payment.html stripe.js
# (login 파일들은 여전히 없음!)
결과
브랜치별 파일 구성:
1
2
3
4
5
6
7
8
9
10
11
# main 브랜치
git checkout main && ls
# → README.md index.html
# login 브랜치
git checkout feature/login-system && ls
# → README.md index.html login.html auth.js
# payment 브랜치
git checkout feature/payment-gateway && ls
# → README.md index.html payment.html stripe.js
독립성의 장점:
1
2
3
4
✅ 각 기능이 서로 영향 없이 개발됨
✅ 한 기능의 버그가 다른 기능에 영향 안 줌
✅ 개발 속도가 서로 독립적
✅ 필요시 한 기능만 배포 가능
Topic2. 여러 브랜치 동시 관리
실무에서는 여러 작업을 동시에 진행합니다.
브랜치 간 컨텍스트 스위칭
시나리오: 로그인 개발 중 긴급 버그 수정 요청!
1
2
3
4
5
6
7
8
9
10
11
# 로그인 작업 중
git checkout feature/login-system
# 작업 진행 중...
echo "WIP: Remember me checkbox" >> login.html
git add login.html
# 아직 커밋 안 함 (작업 중!)
# 🚨 긴급 버그 발견! main의 버그 수정 필요
# 하지만 현재 작업이 커밋되지 않음...
해결책: Git Stash 활용:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 1. 현재 작업을 임시 저장
git stash save "WIP: Remember me checkbox"
# 2. main으로 전환 (클린 상태)
git checkout main
# 3. 긴급 수정 브랜치 생성
git checkout -b hotfix/header-typo
# 4. 버그 수정
echo "Fixed typo in header" > CHANGELOG.md
git add CHANGELOG.md
git commit -m "hotfix: Fix typo in header"
# 5. main에 병합
git checkout main
git merge hotfix/header-typo
# 6. 다시 로그인 작업으로 복귀
git checkout feature/login-system
# 7. 임시 저장한 작업 복원
git stash pop
# 8. 계속 작업 진행
git add login.html
git commit -m "feat: Add remember me checkbox"
여러 브랜치 상태 한눈에 보기
모든 브랜치 확인:
1
2
3
4
5
6
7
git branch -v
# 출력:
feature/login-system d4e5f6g Add remember me
* feature/payment-gateway a1b2c3d Add Stripe integration
hotfix/header-typo b2c3d4e Fix header typo
main c3d4e5f Initial structure
그래픽으로 보기:
1
2
3
4
5
6
7
8
9
git log --oneline --all --graph --decorate
# 출력:
* d4e5f6g (feature/login-system) Add remember me
| * a1b2c3d (HEAD -> feature/payment-gateway) Add Stripe
|/
| * b2c3d4e (hotfix/header-typo) Fix header typo
|/
* c3d4e5f (main) Initial structure
해보기: 3개 기능 동시 개발
상황: 로그인, 결제, 검색 기능을 3명이 동시 개발
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 개발자 A: 로그인 기능
git checkout -b feature/login
echo "Login feature" > login.js
git add login.js
git commit -m "feat: Implement login"
# 상태 저장 (전환 전)
git log --oneline -1
# d1 feat: Implement login
# 개발자 B: 결제 기능 (다른 브랜치)
git checkout main
git checkout -b feature/payment
echo "Payment feature" > payment.js
git add payment.js
git commit -m "feat: Implement payment"
# 개발자 C: 검색 기능 (또 다른 브랜치)
git checkout main
git checkout -b feature/search
echo "Search feature" > search.js
git add search.js
git commit -m "feat: Implement search"
# 전체 브랜치 상태 확인
git log --oneline --all --graph
# 출력:
* s1 (feature/search) Implement search
| * p1 (feature/payment) Implement payment
|/
| * d1 (feature/login) Implement login
|/
* m1 (main) Initial structure
브랜치 전환 연습:
1
2
3
4
5
6
7
8
9
10
11
12
# 로그인 → 결제 → 검색 → main
git checkout feature/login
ls # login.js만 있음
git checkout feature/payment
ls # payment.js만 있음
git checkout feature/search
ls # search.js만 있음
git checkout main
ls # 기본 파일만 있음
결과
동시 작업의 효율성:
gitGraph
commit id: "main"
branch feature/login
branch feature/payment
branch feature/search
checkout feature/login
commit id: "Login v1"
commit id: "Login v2"
checkout feature/payment
commit id: "Payment v1"
checkout feature/search
commit id: "Search v1"
commit id: "Search v2"
실무 장점:
1
2
3
4
✅ 3명이 서로 방해 없이 작업
✅ 각자 다른 속도로 진행 가능
✅ 한 기능의 문제가 다른 기능에 영향 없음
✅ 완성된 기능부터 순차 병합 가능
Topic3. 브랜치 작업 실전 워크플로우
실무에서 자주 사용하는 브랜치 워크플로우입니다.
워크플로우 1: Feature Branch Workflow
가장 기본적인 협업 방식:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 1. 최신 main 받기
git checkout main
git pull origin main
# 2. 기능 브랜치 생성
git checkout -b feature/user-profile
# 3. 개발 및 커밋
echo "Profile page" > profile.html
git add profile.html
git commit -m "feat: Add profile page"
echo "Profile CSS" > profile.css
git add profile.css
git commit -m "style: Add profile styles"
echo "Profile JS" > profile.js
git add profile.js
git commit -m "feat: Add profile interactions"
# 4. GitHub에 푸시
git push -u origin feature/user-profile
# 5. Pull Request 생성 (GitHub에서)
# 6. 코드 리뷰
# 7. 승인 후 main에 병합
워크플로우 2: Git Flow 전략
대규모 프로젝트에서 사용:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 초기 설정
git checkout -b develop
# Feature 개발
git checkout -b feature/shopping-cart
# 작업 1
echo "Cart model" > cart-model.js
git add cart-model.js
git commit -m "feat: Add cart data model"
# 작업 2
echo "Cart view" > cart-view.js
git add cart-view.js
git commit -m "feat: Add cart UI component"
# 작업 3
echo "Cart controller" > cart-controller.js
git add cart-controller.js
git commit -m "feat: Add cart controller logic"
# develop에 병합
git checkout develop
git merge feature/shopping-cart
git branch -d feature/shopping-cart
# Release 준비
git checkout -b release/v1.0.0
echo "1.0.0" > VERSION
git add VERSION
git commit -m "chore: Bump version to 1.0.0"
# 최종 버그 수정
echo "Fixed minor bugs" >> CHANGELOG.md
git add CHANGELOG.md
git commit -m "fix: Minor bug fixes for release"
# main에 병합
git checkout main
git merge release/v1.0.0
git tag v1.0.0
# develop에도 반영
git checkout develop
git merge release/v1.0.0
# 정리
git branch -d release/v1.0.0
Git Flow 구조:
gitGraph
commit id: "init"
branch develop
checkout develop
commit id: "dev setup"
branch feature/cart
checkout feature/cart
commit id: "cart model"
commit id: "cart view"
commit id: "cart logic"
checkout develop
merge feature/cart
branch release/v1.0
checkout release/v1.0
commit id: "version bump"
commit id: "bug fixes"
checkout main
merge release/v1.0 tag: "v1.0.0"
checkout develop
merge release/v1.0
워크플로우 3: 긴급 수정 (Hotfix)
프로덕션 버그 긴급 수정:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 1. main에서 hotfix 브랜치 생성
git checkout main
git checkout -b hotfix/security-patch
# 2. 긴급 수정
echo "Security fix applied" > security-patch.txt
git add security-patch.txt
git commit -m "hotfix: Critical security vulnerability fix"
# 추가 수정
echo "Additional validation" >> auth.js
git add auth.js
git commit -m "hotfix: Add input validation"
# 3. main에 즉시 병합
git checkout main
git merge hotfix/security-patch
git tag v1.0.1
# 4. develop에도 반영 (중요!)
git checkout develop
git merge hotfix/security-patch
# 5. 배포
git push origin main --tags
git push origin develop
# 6. 정리
git branch -d hotfix/security-patch
해보기: 완전한 실전 시나리오
상황: 팀 프로젝트 시뮬레이션
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# === 초기 설정 ===
mkdir team-project
cd team-project
git init
echo "# Team Project" > README.md
git add README.md
git commit -m "Initial commit"
# develop 브랜치 생성
git checkout -b develop
# === 개발자 A: 로그인 기능 ===
git checkout -b feature/login
echo "Login form HTML" > login.html
git add login.html
git commit -m "feat: Add login form"
echo "Auth logic" > auth.js
git add auth.js
git commit -m "feat: Implement authentication"
# develop에 병합
git checkout develop
git merge feature/login
git branch -d feature/login
# === 개발자 B: 대시보드 (동시 작업) ===
git checkout -b feature/dashboard
echo "Dashboard HTML" > dashboard.html
git add dashboard.html
git commit -m "feat: Add dashboard layout"
echo "Dashboard widgets" > widgets.js
git add widgets.js
git commit -m "feat: Add dashboard widgets"
# develop에 병합
git checkout develop
git merge feature/dashboard
git branch -d feature/dashboard
# === 🚨 긴급 버그 발견! ===
git checkout main
git checkout -b hotfix/login-bug
echo "Fixed login bug" > bug-fix.txt
git add bug-fix.txt
git commit -m "hotfix: Fix login redirect issue"
# main에 병합
git checkout main
git merge hotfix/login-bug
git tag v1.0.1
# develop에도 반영
git checkout develop
git merge hotfix/login-bug
# === Release 준비 ===
git checkout -b release/v2.0.0
echo "2.0.0" > VERSION
git add VERSION
git commit -m "chore: Version 2.0.0"
# main에 병합
git checkout main
git merge release/v2.0.0
git tag v2.0.0
# develop에도 반영
git checkout develop
git merge release/v2.0.0
# === 최종 상태 확인 ===
git log --oneline --all --graph --decorate
결과
완성된 브랜치 구조:
1
2
3
4
5
6
7
8
9
10
* (tag: v2.0.0, main, develop) Version 2.0.0
* Merge release/v2.0.0
|\
| * Dashboard widgets
| * Dashboard layout
* Merge hotfix/login-bug
|\
| * (tag: v1.0.1) Fix login redirect
* | Auth logic
* | Login form
실전 워크플로우 정리:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1. Feature 개발
├─ develop에서 feature/* 브랜치 생성
├─ 개발 완료 후 develop에 병합
└─ feature 브랜치 삭제
2. Release 준비
├─ develop에서 release/* 브랜치 생성
├─ 버전 업데이트 및 최종 테스트
├─ main과 develop에 모두 병합
└─ release 브랜치 삭제
3. Hotfix (긴급 수정)
├─ main에서 hotfix/* 브랜치 생성
├─ 빠른 수정 및 테스트
├─ main과 develop에 모두 병합
└─ hotfix 브랜치 삭제
정리
오늘 배운 내용:
1. 브랜치별 독립 작업:
- 각 브랜치는 완전히 독립적인 파일 구성
- 한 브랜치의 변경이 다른 브랜치에 영향 없음
- 여러 기능을 병렬로 안전하게 개발 가능
2. 여러 브랜치 동시 관리:
1
2
3
git stash # 작업 임시 저장
git stash pop # 저장한 작업 복원
git log --all --graph # 전체 브랜치 시각화
3. 실전 워크플로우:
- Feature Branch: 기능별 브랜치 개발
- Git Flow: develop/feature/release/hotfix 체계
- Hotfix: 긴급 수정 프로세스
다음 단계: Day 45에서 브랜치 삭제 방법을 배웁니다.
완료 체크:
- 여러 브랜치에서 독립적으로 작업할 수 있다
- Stash를 사용해 작업을 전환할 수 있다
- 실전 워크플로우를 적용할 수 있다
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
