포스트

[GitHub 100일 챌린지] Day 44 - 각 브랜치에서 작업

[GitHub 100일 챌린지] Day 44 - 각 브랜치에서 작업

100일 챌린지 Day 44 - 여러 브랜치를 오가며 독립적으로 작업하는 방법을 배웁니다.

배울 내용

  1. 브랜치별 독립적인 작업
  2. 여러 브랜치 동시 관리
  3. 브랜치 작업 실전 워크플로우

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.js
  • feature/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 라이센스를 따릅니다.