====== 브랜치 관리 - 여러 기능을 동시에 안전하게 개발하기 ====== **브랜치가 뭔가요?** 🤔 브랜치는 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 " 로그인

로그인

" > 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단계: 충돌 파일 내용 이해하기** %%<<<<<<< HEAD%% 메인 페이지 %%=======%% 로그인 페이지 %%>>>>>>> feature-login%%

환영합니다!

**💡 충돌 마커 의미:** * %%<<<<<<< HEAD%%: 현재 브랜치(''main'')의 내용 시작 * %%=======%%: 두 브랜치 내용의 구분선 * %%>>>>>>> feature-login%%: 합치려는 브랜치의 내용 끝 **4단계: 충돌 해결하기** # 에디터로 파일 수정 (충돌 마커 제거하고 원하는 내용으로 수정) nano index.html # 수정 후 내용 예시: # 메인 페이지 - 로그인 **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. 새 브랜치 ''feature/hello-world'' 생성 - 2. ''hello.html'' 파일 만들기 - 3. 커밋하고 메인 브랜치로 병합하기 - 4. 브랜치 삭제하기 ==== 연습 2: 여러 브랜치 동시 작업 ==== - 1. ''feature/header'' 브랜치에서 헤더 개발 - 2. ''feature/footer'' 브랜치에서 푸터 개발 - 3. 각각 메인 브랜치로 병합하기 ==== 연습 3: 충돌 해결 연습 ==== - 1. 메인 브랜치에서 ''index.html''의 제목 수정 - 2. 새 브랜치에서 같은 파일의 같은 부분 다르게 수정 - 3. 병합 시 발생하는 충돌 해결하기 ===== 🔗 관련 용어 ===== **더 자세한 설명이 필요하시면:** * [[wiki:glossary:development_tools:git:branch|Branch]] - 브랜치 개념 자세히 * [[wiki:glossary:development_tools:git:merge|Merge]] - 병합 이해하기 * [[wiki:glossary:development_tools:git:commit|Commit]] - 커밋 개념 ===== 🚀 다음 단계 ===== **브랜치 관리를 익혔다면:** - 1. **[[wiki:it:github:troubleshooting|문제 해결]]** - 막혔을 때 해결 방법 - 2. **[[wiki:it:github:advanced_tips|고급 팁]]** - 더 효율적으로 사용하기 - 3. **Pull Request 배우기** - 팀원과 협업하는 방법 ===== 🎓 마무리 ===== **축하합니다! 🎉 이제 브랜치를 사용할 수 있습니다!** **여러분이 배운 것들:** * ✅ 브랜치 개념 이해 * ✅ 브랜치 생성, 이동, 삭제 * ✅ 브랜치 병합 (Merge) * ✅ 충돌 해결 방법 * ✅ 브랜치 전략과 모범 사례 **브랜치를 사용하면:** * 🚀 여러 기능을 동시에 안전하게 개발 * 🛡️ 메인 코드를 보호하면서 실험 가능 * 👥 팀원들과 효율적으로 협업 * 📈 더 체계적인 개발 프로세스 **다음 단계로 넘어가기 전에:** * 실제 프로젝트에서 브랜치를 사용해보세요 * 작은 기능부터 시작해서 점차 복잡한 작업으로 확장해보세요 * 충돌 해결 연습을 많이 해보세요 **이제 문제 해결 가이드를 통해 막혔을 때 해결하는 방법을 배워보세요!** 🌟 ---- **이전:** [[wiki:it:github:remote_operations|🌐 GitHub와 연동하기]] | **다음:** [[wiki:it:github:troubleshooting|🔧 문제 해결하기]] | **목록:** [[wiki:it:github:start|📋 전체 문서 목록]]