사용자 도구

사이트 도구


wiki:it:github:branch_management

브랜치 관리 - 여러 기능을 동시에 안전하게 개발하기

브랜치가 뭔가요? 🤔 브랜치는 Git의 가장 강력한 기능 중 하나입니다! 마치 평행우주처럼, 메인 코드를 건드리지 않고 새로운 기능을 안전하게 개발할 수 있게 해줍니다. 초보자도 쉽게 이해할 수 있도록 차근차근 설명해드릴게요!

🌳 브랜치가 뭔가요? 쉽게 이해하기

브랜치를 나무로 비유하면

메인 브랜치 (main) = 나무의 줄기

  • 가장 안정적이고 중요한 코드
  • 항상 동작하는 완성된 코드만 있어야 함
  • 사용자들이 실제로 사용하는 코드

기능 브랜치 (feature) = 나무의 가지

  • 새로운 기능을 개발하는 곳
  • 실험적인 코드, 아직 완성되지 않은 코드
  • 문제가 생겨도 메인 브랜치에 영향 없음

실생활 예시로 이해하기

웹사이트를 만든다고 가정해봅시다:

main 브랜치 (메인 웹사이트)
├── login-feature 브랜치 (로그인 기능 개발 중)
├── payment-feature 브랜치 (결제 기능 개발 중)
└── design-update 브랜치 (디자인 업데이트 중)

이렇게 하면 좋은 점:

  • 로그인 기능 개발 중 문제가 생겨도 메인 웹사이트는 정상 작동
  • 여러 사람이 동시에 다른 기능을 개발 가능
  • 완성된 기능만 메인 브랜치에 합치기 가능

🚀 브랜치 기본 사용법

브랜치 확인하기

# 현재 브랜치 확인
git branch
 
# 결과 예시:
# * main    ← 현재 브랜치 (별표로 표시)
#   feature-login
#   feature-payment
 
# 원격 브랜치까지 모두 보기
git branch -a
 
# 브랜치 상세 정보 보기
git branch -v

💡 브랜치 이름 앞의 기호 의미:

  • * : 현재 작업 중인 브랜치
  • main : 메인 브랜치 (가장 중요한 브랜치)

새 브랜치 만들기

# 새 브랜치 생성 (현재 브랜치에서 복사)
git branch feature-login
 
# 새 브랜치 생성하고 바로 이동
git checkout -b feature-login
 
# 또는 최신 Git에서는 (더 직관적)
git switch -c feature-login
 
# 브랜치 생성 확인
git branch

💡 브랜치 이름 짓기 규칙:

  • feature-기능명: 새로운 기능 개발
  • bugfix-문제명: 버그 수정
  • hotfix-문제명: 긴급 수정
  • 예: feature-user-login, bugfix-payment-error

브랜치 이동하기

# 다른 브랜치로 이동 (기존 방식)
git checkout main
git checkout feature-login
 
# 더 직관적인 방식 (Git 2.23+)
git switch main
git switch feature-login
 
# 이동 후 확인
git branch
''pwd''  # 현재 위치는 같지만 Git 상태가 다름

⚠️ 브랜치 이동 시 주의사항:

  • 변경사항이 있으면 먼저 커밋하거나 stash 해야 함
  • 브랜치마다 파일 상태가 다를 수 있음

🔄 브랜치 작업 흐름 - 실제 개발 시나리오

시나리오: 로그인 기능 개발하기

1단계: 새 기능 브랜치 생성

# 메인 브랜치에서 시작
git switch main
 
# 최신 코드 받기
git pull origin main
 
# 새 기능 브랜치 생성
git switch -c feature-user-login
 
# 현재 상태 확인
git branch
git status

2단계: 기능 개발하기

# 로그인 페이지 파일 생성
echo "<!DOCTYPE html>
<html>
<head><title>로그인</title></head>
<body>
    <h1>로그인</h1>
    <form>
        <input type='email' placeholder='이메일'>
        <input type='password' placeholder='비밀번호'>
        <button type='submit'>로그인</button>
    </form>
</body>
</html>" > login.html
 
# 로그인 스타일 파일 생성
echo "form {
    max-width: 400px;
    margin: 50px auto;
    padding: 20px;
    border: 1px solid #ccc;
    border-radius: 5px;
}
 
input, button {
    width: 100%;
    padding: 10px;
    margin: 10px 0;
    border: 1px solid #ddd;
    border-radius: 3px;
}" > login.css
 
# 변경사항 확인
git status
git diff

3단계: 단계별 커밋하기

# HTML 파일 먼저 커밋
git add login.html
git commit -m "로그인 페이지 HTML 구조 추가"
 
# CSS 파일 커밋
git add login.css
git commit -m "로그인 페이지 스타일 추가"
 
# 커밋 히스토리 확인
git log --oneline

4단계: GitHub에 브랜치 업로드

# 새 브랜치를 GitHub에 업로드
git push -u origin feature-user-login
 
# 이후부터는 간단히
git push

5단계: 메인 브랜치로 합치기 (Merge)

# 메인 브랜치로 이동
git switch main
 
# 최신 코드 받기 (중요!)
git pull origin main
 
# 기능 브랜치 합치기
git merge feature-user-login
 
# 메인 브랜치에 업로드
git push origin main

6단계: 정리하기

# 로컬 브랜치 삭제
git branch -d feature-user-login
 
# 원격 브랜치 삭제
git push origin --delete feature-user-login

🔀 브랜치 합치기 - Merge vs Rebase

Merge (병합) - 초보자 추천

Merge는 두 브랜치를 합치는 가장 안전한 방법입니다.

# 메인 브랜치로 이동
git switch main
 
# 기능 브랜치 합치기
git merge feature-login
 
# 결과: 병합 커밋이 생성됨
git log --oneline --graph

Merge의 장점:

  • 🟢 안전함: 원본 커밋 히스토리가 보존됨
  • 🟢 쉬움: 이해하기 쉽고 실수할 확률이 낮음
  • 🟢 추적 가능: 언제 어떤 기능이 합쳐졌는지 명확함

Merge의 단점:

  • 🔴 복잡함: 히스토리가 복잡해 보일 수 있음
  • 🔴 병합 커밋: 추가 커밋이 생성됨

Rebase (재배치) - 고급 사용자용

Rebase는 깔끔한 히스토리를 만들지만 더 복잡합니다.

# 기능 브랜치에서 실행
git switch feature-login
 
# 메인 브랜치의 최신 변경사항을 기준으로 재배치
git rebase main
 
# 메인 브랜치로 이동해서 Fast-forward 병합
git switch main
git merge feature-login

⚠️ Rebase 주의사항:

  • 이미 GitHub에 올린 브랜치는 rebase 하지 마세요
  • 충돌이 발생하면 해결하기 더 복잡합니다
  • 처음에는 merge를 사용하는 것을 추천합니다

🚨 브랜치 충돌 해결하기

충돌이 언제 발생하나요?

같은 파일의 같은 부분을 서로 다르게 수정했을 때 발생합니다.

예시 상황:

  • main 브랜치에서 index.html의 제목을 “메인 페이지”로 수정
  • feature-login 브랜치에서 같은 index.html의 제목을 “로그인 페이지”로 수정
  • 두 브랜치를 합치려고 할 때 충돌 발생

충돌 해결 과정

1단계: 충돌 발생 확인

git merge feature-login
 
# 충돌 발생 시 이런 메시지가 나옵니다:
# Auto-merging index.html
# CONFLICT (content): Merge conflict in index.html
# Automatic merge failed; fix conflicts and then commit the result.

2단계: 충돌 파일 확인

# 충돌 상태 확인
git status
 
# 충돌 파일 내용 확인
cat index.html

3단계: 충돌 파일 내용 이해하기

<!DOCTYPE html>
<html>
<head>
%%<<<<<<< HEAD%%
    <title>메인 페이지</title>
%%=======%%
    <title>로그인 페이지</title>
%%>>>>>>> feature-login%%
</head>
<body>
    <h1>환영합니다!</h1>
</body>
</html>

💡 충돌 마커 의미:

  • <<<<<<< HEAD: 현재 브랜치(main)의 내용 시작
  • =======: 두 브랜치 내용의 구분선
  • >>>>>>> feature-login: 합치려는 브랜치의 내용 끝

4단계: 충돌 해결하기

# 에디터로 파일 수정 (충돌 마커 제거하고 원하는 내용으로 수정)
nano index.html
 
# 수정 후 내용 예시:
# <title>메인 페이지 - 로그인</title>

5단계: 충돌 해결 완료

# 수정된 파일 추가
git add index.html
 
# 병합 커밋 완료
git commit -m "Merge feature-login: 로그인 기능 추가"
 
# 결과 확인
git log --oneline --graph

🌿 브랜치 전략 - 팀 작업 시 규칙

Git Flow (대표적인 브랜치 전략)

main (메인 브랜치)
├── develop (개발 브랜치)
│   ├── feature/login (기능 개발)
│   ├── feature/payment (기능 개발)
│   └── feature/dashboard (기능 개발)
├── release/v1.0 (출시 준비)
└── hotfix/critical-bug (긴급 수정)

브랜치별 역할:

  • main: 출시된 안정적인 코드
  • develop: 개발 중인 코드들이 합쳐지는 곳
  • feature: 새로운 기능 개발
  • release: 출시 준비 및 테스트
  • hotfix: 긴급 버그 수정

간단한 브랜치 전략 (초보자 추천)

main (메인 브랜치)
├── feature/기능명 (새 기능)
├── bugfix/버그명 (버그 수정)
└── hotfix/긴급수정 (긴급 수정)

작업 흐름:

  • 1. main에서 새 브랜치 생성
  • 2. 기능 개발 완료
  • 3. main으로 병합
  • 4. 브랜치 삭제

🔧 고급 브랜치 명령어

브랜치 정보 확인

# 병합된 브랜치 확인
git branch --merged
 
# 병합되지 않은 브랜치 확인
git branch --no-merged
 
# 브랜치 생성 날짜 확인
git for-each-ref --format='%(refname:short) %(committerdate)' refs/heads
 
# 브랜치 마지막 커밋 확인
git branch -v

브랜치 삭제

# 로컬 브랜치 삭제 (안전한 삭제)
git branch -d feature-login
 
# 강제 삭제 (병합되지 않은 브랜치도 삭제)
git branch -D feature-login
 
# 원격 브랜치 삭제
git push origin --delete feature-login
 
# 로컬에서 원격 브랜치 참조 정리
git remote prune origin

브랜치 이름 변경

# 현재 브랜치 이름 변경
git branch -m new-branch-name
 
# 다른 브랜치 이름 변경
git branch -m old-name new-name
 
# 원격 브랜치 이름 변경 (삭제 후 새로 생성)
git push origin --delete old-name
git push origin new-name

🎯 브랜치 사용 모범 사례

좋은 브랜치 이름 짓기

추천하는 이름 규칙:

# 기능 개발
feature/user-authentication
feature/payment-integration
feature/admin-dashboard

# 버그 수정
bugfix/login-error
bugfix/payment-failure
bugfix/mobile-responsive

# 긴급 수정
hotfix/security-patch
hotfix/server-crash
hotfix/data-loss

# 실험적 기능
experiment/new-ui
experiment/performance-test

피해야 할 이름:

# 너무 모호함
feature/update
bugfix/fix
test

# 너무 김
feature/implement-user-authentication-with-email-verification-and-password-reset

브랜치 작업 시 좋은 습관

1. 작업 시작 전 항상 최신 코드 받기

git switch main
git pull origin main
git switch -c feature/new-feature

2. 작은 단위로 자주 커밋하기

# 좋은 예: 작은 단위로 커밋
git commit -m "로그인 폼 HTML 구조 추가"
git commit -m "로그인 폼 스타일 적용"
git commit -m "로그인 검증 로직 추가"
 
# 나쁜 예: 모든 것을 한 번에 커밋
git commit -m "로그인 기능 완성"

3. 브랜치 하나당 기능 하나

# 좋은 예: 기능별로 브랜치 분리
feature/user-login
feature/user-registration
feature/password-reset
 
# 나쁜 예: 여러 기능을 한 브랜치에
feature/user-management  # 너무 범위가 넓음

4. 정기적으로 메인 브랜치와 동기화

# 장기간 개발하는 브랜치는 주기적으로 동기화
git switch feature/long-term-feature
git merge main  # 또는 git rebase main

🚨 자주 발생하는 문제와 해결법

문제 1: 브랜치 이동 시 "변경사항이 있다" 오류

오류 메시지:

error: Your local changes to the following files would be overwritten by checkout:
	''file.txt''
Please commit your changes or stash them before you switch branches.

해결법:

# 방법 1: 커밋하기
''git add .''
git commit -m "작업 중인 내용 임시 저장"
 
# 방법 2: 임시 저장 (stash)
''git stash''
git switch other-branch
git switch back-to-original-branch
''git stash pop''

문제 2: 브랜치 삭제 시 "병합되지 않았다" 오류

오류 메시지:

error: The branch '''feature-login''' is not fully merged.
If you are sure you want to delete it, run '''git branch -D feature-login'''.

해결법:

# 브랜치를 정말 삭제하고 싶다면
''git branch -D feature-login''
 
# 또는 먼저 병합 후 삭제
git switch main
git merge feature-login
git branch -d feature-login

문제 3: 원격 브랜치가 로컬에 없을 때

상황: 팀원이 만든 브랜치를 내 컴퓨터에서 사용하고 싶을 때

해결법:

# 원격 브랜치 정보 업데이트
git fetch origin
 
# 원격 브랜치 목록 확인
git branch -r
 
# 원격 브랜치를 로컬로 가져오기
git switch -c feature-login origin/feature-login
 
# 또는 간단히
git switch feature-login  # Git이 자동으로 원격 브랜치를 추적

📚 연습 문제

직접 해보면서 브랜치 사용법을 익혀보세요!

연습 1: 기본 브랜치 작업

  1. 1. 새 브랜치 feature/hello-world 생성
  2. 2. hello.html 파일 만들기
  3. 3. 커밋하고 메인 브랜치로 병합하기
  4. 4. 브랜치 삭제하기

연습 2: 여러 브랜치 동시 작업

  1. 1. feature/header 브랜치에서 헤더 개발
  2. 2. feature/footer 브랜치에서 푸터 개발
  3. 3. 각각 메인 브랜치로 병합하기

연습 3: 충돌 해결 연습

  1. 1. 메인 브랜치에서 index.html의 제목 수정
  2. 2. 새 브랜치에서 같은 파일의 같은 부분 다르게 수정
  3. 3. 병합 시 발생하는 충돌 해결하기

🔗 관련 용어

더 자세한 설명이 필요하시면:

  • Branch - 브랜치 개념 자세히
  • Merge - 병합 이해하기
  • Commit - 커밋 개념

🚀 다음 단계

브랜치 관리를 익혔다면:

  1. 1. 문제 해결 - 막혔을 때 해결 방법
  2. 2. 고급 팁 - 더 효율적으로 사용하기
  3. 3. Pull Request 배우기 - 팀원과 협업하는 방법

🎓 마무리

축하합니다! 🎉 이제 브랜치를 사용할 수 있습니다!

여러분이 배운 것들:

  • ✅ 브랜치 개념 이해
  • ✅ 브랜치 생성, 이동, 삭제
  • ✅ 브랜치 병합 (Merge)
  • ✅ 충돌 해결 방법
  • ✅ 브랜치 전략과 모범 사례

브랜치를 사용하면:

  • 🚀 여러 기능을 동시에 안전하게 개발
  • 🛡️ 메인 코드를 보호하면서 실험 가능
  • 👥 팀원들과 효율적으로 협업
  • 📈 더 체계적인 개발 프로세스

다음 단계로 넘어가기 전에:

  • 실제 프로젝트에서 브랜치를 사용해보세요
  • 작은 기능부터 시작해서 점차 복잡한 작업으로 확장해보세요
  • 충돌 해결 연습을 많이 해보세요

이제 문제 해결 가이드를 통해 막혔을 때 해결하는 방법을 배워보세요! 🌟


이전: 🌐 GitHub와 연동하기 | 다음: 🔧 문제 해결하기 | 목록: 📋 전체 문서 목록

wiki/it/github/branch_management.txt · 마지막으로 수정됨: 저자 syjang0803

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki