Git 브랜치

Git 브랜치

1. λΈŒλžœμΉ˜λž€?

λΈŒλžœμΉ˜λŠ” 독립적인 μž‘μ—… κ³΅κ°„μž…λ‹ˆλ‹€. 메인 μ½”λ“œμ— 영ν–₯을 μ£Όμ§€ μ•Šκ³  μƒˆλ‘œμš΄ κΈ°λŠ₯을 κ°œλ°œν•˜κ±°λ‚˜ 버그λ₯Ό μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

         feature-login
              β”‚
              β–Ό
        β”Œβ”€β”€β”€(B)───(C)
        β”‚
(1)───(2)───(3)───(4)   main
              β”‚
              β–Ό
        └───(X)───(Y)
              β”‚
              β–Ό
         bugfix-header

브랜치λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

  • μ•ˆμ „ν•œ μ‹€ν—˜: 메인 μ½”λ“œ 손상 없이 μƒˆ κΈ°λŠ₯ ν…ŒμŠ€νŠΈ
  • 병렬 μž‘μ—…: μ—¬λŸ¬ κΈ°λŠ₯을 λ™μ‹œμ— 개발
  • 체계적 관리: κΈ°λŠ₯별, λ²„κ·Έλ³„λ‘œ μž‘μ—… 뢄리
  • ν˜‘μ—… 용이: 각자 λΈŒλžœμΉ˜μ—μ„œ μž‘μ—… ν›„ 병합

2. 브랜치 κΈ°λ³Έ λͺ…λ Ήμ–΄

브랜치 λͺ©λ‘ 확인

# 둜컬 브랜치 λͺ©λ‘
git branch

# 원격 브랜치 포함
git branch -a

# 브랜치 상세 정보
git branch -v

브랜치 생성

# 브랜치 생성 (μ΄λ™ν•˜μ§€ μ•ŠμŒ)
git branch 브랜치λͺ…

# 브랜치 생성 + 이동
git checkout -b 브랜치λͺ…

# Git 2.23+ ꢌμž₯ 방법
git switch -c 브랜치λͺ…

브랜치 이동

# κΈ°μ‘΄ 방법
git checkout 브랜치λͺ…

# Git 2.23+ ꢌμž₯ 방법
git switch 브랜치λͺ…

브랜치 μ‚­μ œ

# λ³‘ν•©λœ 브랜치 μ‚­μ œ
git branch -d 브랜치λͺ…

# κ°•μ œ μ‚­μ œ (병합 μ•ˆ 됐어도)
git branch -D 브랜치λͺ…

브랜치 이름 λ³€κ²½

# ν˜„μž¬ 브랜치 이름 λ³€κ²½
git branch -m μƒˆμ΄λ¦„

# νŠΉμ • 브랜치 이름 λ³€κ²½
git branch -m 기쑴이름 μƒˆμ΄λ¦„

3. 브랜치 병합 (Merge)

μž‘μ—…μ΄ μ™„λ£Œλœ 브랜치λ₯Ό λ‹€λ₯Έ λΈŒλžœμΉ˜μ— ν•©μΉ©λ‹ˆλ‹€.

κΈ°λ³Έ 병합

# 1. main 브랜치둜 이동
git switch main

# 2. feature 브랜치λ₯Ό main에 병합
git merge feature-branch

λ³‘ν•©μ˜ μ’…λ₯˜

Fast-forward Merge

λΈŒλžœμΉ˜κ°€ λΆ„κΈ°λœ ν›„ main에 변경이 없을 λ•Œ:

Before:
main:    (1)───(2)
                └───(A)───(B)  feature

After:
main:    (1)───(2)───(A)───(B)
                              feature (μ‚­μ œ)
git switch main
git merge feature
# Fast-forward λ©”μ‹œμ§€ 좜λ ₯

3-Way Merge

μ–‘μͺ½ 브랜치 λͺ¨λ‘ 변경이 μžˆμ„ λ•Œ:

Before:
              (A)───(B)  feature
             /
main:  (1)───(2)───(3)───(4)

After:
              (A)───(B)
             /         \
main:  (1)───(2)───(3)───(4)───(M)  Merge commit
git switch main
git merge feature
# Merge commit이 생성됨

4. 좩돌 ν•΄κ²° (Conflict Resolution)

같은 파일의 같은 뢀뢄을 μˆ˜μ •ν–ˆμ„ λ•Œ 좩돌이 λ°œμƒν•©λ‹ˆλ‹€.

좩돌 λ°œμƒ μ‹œ 파일 λ‚΄μš©

<<<<<<< HEAD
main λΈŒλžœμΉ˜μ—μ„œ μˆ˜μ •ν•œ λ‚΄μš©
=======
feature λΈŒλžœμΉ˜μ—μ„œ μˆ˜μ •ν•œ λ‚΄μš©
>>>>>>> feature-branch

좩돌 ν•΄κ²° κ³Όμ •

# 1. 좩돌 확인
git status
# 좜λ ₯: both modified: 좩돌파일.txt

# 2. νŒŒμΌμ„ μ—΄μ–΄ 좩돌 ν•΄κ²°
# <<<<<<< HEAD λΆ€ν„° >>>>>>> κΉŒμ§€ μˆ˜μ •

# 3. ν•΄κ²° ν›„ μŠ€ν…Œμ΄μ§•
git add 좩돌파일.txt

# 4. 병합 μ™„λ£Œ
git commit -m "merge: feature-branch 병합, 좩돌 ν•΄κ²°"

좩돌 ν•΄κ²° μ˜ˆμ‹œ

좩돌 μ „:

<<<<<<< HEAD
console.log("Hello from main");
=======
console.log("Hello from feature");
>>>>>>> feature-branch

좩돌 ν•΄κ²° ν›„:

console.log("Hello from main");
console.log("Hello from feature");

병합 μ·¨μ†Œ

# 좩돌 쀑 병합 μ·¨μ†Œ
git merge --abort

5. 브랜치 μ „λž΅

Git Flow

main ─────────────────────────────────────────▢ 배포용
  β”‚
  └─ develop ─────────────────────────────────▢ 개발용
       β”‚
       β”œβ”€ feature/login ──────────────────────▢ κΈ°λŠ₯ 개발
       β”‚
       β”œβ”€ feature/signup ─────────────────────▢ κΈ°λŠ₯ 개발
       β”‚
       └─ release/1.0 ────────────────────────▢ 배포 μ€€λΉ„

브랜치 넀이밍 κ·œμΉ™

접두사 μš©λ„ μ˜ˆμ‹œ
feature/ μƒˆ κΈ°λŠ₯ 개발 feature/login
bugfix/ 버그 μˆ˜μ • bugfix/header-crash
hotfix/ κΈ΄κΈ‰ μˆ˜μ • hotfix/security-patch
release/ 배포 μ€€λΉ„ release/1.0.0

μ‹€μŠ΅ 예제: 브랜치 μž‘μ—… 전체 흐름

# 1. ν”„λ‘œμ νŠΈ μ€€λΉ„
mkdir branch-practice
cd branch-practice
git init
echo "# Main Project" > README.md
git add .
git commit -m "initial commit"

# 2. feature 브랜치 생성 및 이동
git switch -c feature/greeting

# 3. featureμ—μ„œ μž‘μ—…
echo "function greet() { console.log('Hello!'); }" > greet.js
git add .
git commit -m "feat: greeting ν•¨μˆ˜ μΆ”κ°€"

echo "function bye() { console.log('Goodbye!'); }" >> greet.js
git add .
git commit -m "feat: bye ν•¨μˆ˜ μΆ”κ°€"

# 4. 브랜치 μƒνƒœ 확인
git log --oneline --all --graph

# 5. main으둜 이동 ν›„ 병합
git switch main
git merge feature/greeting -m "merge: greeting κΈ°λŠ₯ 병합"

# 6. 병합 μ™„λ£Œ ν›„ 브랜치 μ‚­μ œ
git branch -d feature/greeting

# 7. μ΅œμ’… 이λ ₯ 확인
git log --oneline --graph

좩돌 μ‹€μŠ΅

# 1. 브랜치 생성
git switch -c feature/update

# 2. featureμ—μ„œ README μˆ˜μ •
echo "Updated by feature" >> README.md
git add .
git commit -m "feat: README μ—…λ°μ΄νŠΈ"

# 3. main으둜 λŒμ•„κ°€μ„œ 같은 파일 μˆ˜μ •
git switch main
echo "Updated by main" >> README.md
git add .
git commit -m "docs: README μ—…λ°μ΄νŠΈ"

# 4. 병합 μ‹œλ„ - 좩돌 λ°œμƒ!
git merge feature/update
# CONFLICT λ©”μ‹œμ§€ 좜λ ₯

# 5. νŒŒμΌμ„ μ—΄μ–΄ 좩돌 ν•΄κ²° ν›„
git add README.md
git commit -m "merge: feature/update 병합, 좩돌 ν•΄κ²°"

λͺ…λ Ήμ–΄ μš”μ•½

λͺ…λ Ήμ–΄ μ„€λͺ…
git branch 브랜치 λͺ©λ‘
git branch 이름 브랜치 생성
git switch 이름 브랜치 이동
git switch -c 이름 생성 + 이동
git branch -d 이름 브랜치 μ‚­μ œ
git merge 브랜치 브랜치 병합
git merge --abort 병합 μ·¨μ†Œ
git log --oneline --graph --all 브랜치 κ·Έλž˜ν”„

λ‹€μŒ 단계

04_GitHub_Getting_Started.mdμ—μ„œ 원격 μ €μž₯μ†Œμ™€ ν˜‘μ—… 방법을 λ°°μ›Œλ΄…μ‹œλ‹€!

to navigate between lessons