개발이 취미인 사람

[Git] - 브랜치(Branch) 개념과 생성/삭제 본문

컴퓨터공학/Git

[Git] - 브랜치(Branch) 개념과 생성/삭제

RyanSin 2025. 12. 19. 20:00
반응형

개요

안녕하세요. 이번 시간에는 Git 브랜치(Branch)의 개념과 생성/삭제 방법에 대해 알아보겠습니다. 브랜치는 Git의 가장 강력한 기능 중 하나로, 독립적인 작업 공간을 만들어 여러 기능을 동시에 개발할 수 있게 해줍니다. 혹시 이전 시간에 내용을 학습하고 오시지 못 하신 분들은 학습하고 오시는 걸 추천드리겠습니다.

 

[Git] - .gitignore 설정 방법

 

 

- 브랜치란?

브랜치(Branch)는 독립적인 작업 공간을 의미합니다. 나뭇가지(branch)처럼 하나의 줄기에서 여러 갈래로 뻗어나가는 것을 상상하면 됩니다.

브랜치가 필요한 이유

브랜치 없이 개발한다고 가정해봅시다.

상황: 3명의 개발자가 하나의 프로젝트를 개발

개발자 A: 로그인 기능 개발 중
개발자 B: 회원가입 기능 개발 중
개발자 C: 긴급 버그 수정 필요!

문제점:
- A와 B의 미완성 코드가 섞임
- C가 버그를 수정하려면 A, B의 작업을 기다려야 함
- 코드 충돌 발생 가능성 높음

브랜치를 사용하면 이런 문제를 해결할 수 있습니다.

main 브랜치 ─────────────────────────────>
              │
              ├── feature/login (개발자 A)
              │
              ├── feature/signup (개발자 B)
              │
              └── hotfix/bug-fix (개발자 C)

각자 독립적인 공간에서 작업 후 완료되면 병합!

브랜치의 장점

장점 설명

독립적 개발 다른 작업에 영향 없이 새 기능 개발
안전한 실험 실패해도 메인 코드에 영향 없음
병렬 작업 여러 기능을 동시에 개발 가능
버전 관리 릴리즈, 핫픽스 등 버전별 관리 용이

- 브랜치 기본 개념

HEAD란?

HEAD는 현재 작업 중인 브랜치를 가리키는 포인터입니다.

# HEAD 확인
cat .git/HEAD

# 출력 예시
ref: refs/heads/main

브랜치의 실체

브랜치는 사실 특정 커밋을 가리키는 포인터입니다. 새 커밋을 하면 브랜치 포인터가 최신 커밋으로 이동합니다.

커밋 히스토리:

A --- B --- C --- D (main, HEAD)
                  ↑
            현재 위치

새 브랜치를 만들면:

A --- B --- C --- D (main)
                  ↑
                  └── (feature, HEAD)

- 브랜치 조회

로컬 브랜치 목록

# 브랜치 목록 확인
git branch

# 출력 예시
* main
  feature/login
  feature/signup

* 표시는 현재 체크아웃된 브랜치를 나타냅니다.

원격 브랜치 포함 조회

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

# 출력 예시
* main
  feature/login
  remotes/origin/main
  remotes/origin/feature/login

브랜치 상세 정보

# 마지막 커밋 정보와 함께 조회
git branch -v

# 출력 예시
* main          a1b2c3d feat: 메인 기능 추가
  feature/login b2c3d4e feat: 로그인 구현 중

- 브랜치 생성

기본 생성

# 브랜치 생성 (현재 브랜치에서 이동하지 않음)
git branch 브랜치명

# 예시
git branch feature/login

생성과 동시에 이동

# 브랜치 생성 + 체크아웃 (이동)
git checkout -b 브랜치명

# 예시
git checkout -b feature/login

# Git 2.23 이후 권장 방식
git switch -c 브랜치명

# 예시
git switch -c feature/login

특정 커밋에서 브랜치 생성

# 특정 커밋에서 브랜치 생성
git branch 브랜치명 커밋해시

# 예시
git branch hotfix/bug-fix a1b2c3d

# 생성과 동시에 이동
git checkout -b hotfix/bug-fix a1b2c3d

원격 브랜치 기반으로 생성

# 원격 브랜치를 추적하는 로컬 브랜치 생성
git checkout -b feature/login origin/feature/login

# 또는 간단하게
git checkout --track origin/feature/login

# Git 2.23 이후
git switch -c feature/login origin/feature/login

- 브랜치 이동 (체크아웃)

checkout vs switch

Git 2.23 버전부터 checkout 명령어가 switch와 restore로 분리되었습니다.

# 기존 방식 (checkout)
git checkout 브랜치명

# 새로운 방식 (switch) - 권장
git switch 브랜치명

브랜치 이동

# main 브랜치로 이동
git switch main

# feature/login 브랜치로 이동
git switch feature/login

# 이전 브랜치로 이동
git switch -

이동 시 주의사항

브랜치를 이동하기 전에 현재 작업 내용을 커밋하거나 스태시해야 합니다.

# 커밋하지 않은 변경사항이 있으면 오류 발생
git switch main
# error: Your local changes to the following files would be overwritten

# 해결 방법 1: 커밋
git add .
git commit -m "작업 중 임시 커밋"
git switch main

# 해결 방법 2: 스태시 (나중에 다룰 예정)
git stash
git switch main

- 브랜치 삭제

로컬 브랜치 삭제

# 병합된 브랜치 삭제
git branch -d 브랜치명

# 예시
git branch -d feature/login

# 출력
Deleted branch feature/login (was b2c3d4e).

강제 삭제

병합되지 않은 브랜치를 삭제하려면 -D 옵션을 사용합니다.

# 강제 삭제 (병합 여부 무시)
git branch -D 브랜치명

# 예시
git branch -D feature/experiment

⚠️ 주의: -D 옵션은 병합되지 않은 커밋도 함께 삭제되므로 주의해서 사용하세요!

원격 브랜치 삭제

# 원격 브랜치 삭제
git push origin --delete 브랜치명

# 예시
git push origin --delete feature/login

# 또는
git push origin :feature/login

삭제할 수 없는 경우

현재 체크아웃된 브랜치는 삭제할 수 없습니다.

# 현재 feature/login 브랜치에 있는 상태
git branch -d feature/login
# error: Cannot delete branch 'feature/login' checked out

# 해결: 다른 브랜치로 이동 후 삭제
git switch main
git branch -d feature/login

- 브랜치 이름 규칙

일반적인 명명 규칙

# 기능 개발
feature/기능명
feature/login
feature/user-profile

# 버그 수정
bugfix/버그설명
bugfix/login-error
bugfix/null-pointer

# 긴급 수정
hotfix/수정내용
hotfix/security-patch

# 릴리즈
release/버전
release/1.0.0
release/2024.01

# 개선/리팩토링
improve/개선내용
refactor/리팩토링내용

명명 규칙 예시

타입 패턴 예시

기능 feature/* feature/social-login
버그 bugfix/* bugfix/password-reset
긴급 hotfix/* hotfix/xss-vulnerability
릴리즈 release/* release/v2.1.0
실험 experiment/* experiment/new-algorithm

브랜치 이름 규칙

# 좋은 예시
feature/user-authentication
bugfix/fix-login-redirect
hotfix/security-update

# 나쁜 예시
Feature/Login          # 대문자 사용
feature/login page     # 공백 사용
feature/로그인          # 한글 사용 (가능하지만 비권장)

- 브랜치 실습

전체 흐름을 실습해보겠습니다.

# 1. 프로젝트 생성 및 초기화
mkdir branch-practice
cd branch-practice
git init

# 2. 첫 번째 커밋
echo "# Branch Practice" > README.md
git add .
git commit -m "init: 프로젝트 시작"

# 3. 브랜치 목록 확인
git branch
# * main

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

# 5. 브랜치 확인
git branch
#   main
# * feature/login

# 6. 로그인 기능 개발 (시뮬레이션)
echo "function login() {}" > login.js
git add .
git commit -m "feat: 로그인 함수 추가"

echo "function validateUser() {}" >> login.js
git add .
git commit -m "feat: 사용자 검증 함수 추가"

# 7. 커밋 로그 확인
git log --oneline
# b2c3d4e feat: 사용자 검증 함수 추가
# a1b2c3d feat: 로그인 함수 추가
# 9z8y7x6 init: 프로젝트 시작

# 8. main 브랜치로 이동
git switch main

# 9. main에서는 login.js가 없음 확인
ls
# README.md

# 10. feature/signup 브랜치 생성
git switch -c feature/signup

# 11. 회원가입 기능 개발
echo "function signup() {}" > signup.js
git add .
git commit -m "feat: 회원가입 함수 추가"

# 12. 전체 브랜치 확인
git branch
#   feature/login
# * feature/signup
#   main

# 13. 브랜치별 커밋 확인
git log --oneline --all --graph
# * c3d4e5f (feature/signup) feat: 회원가입 함수 추가
# | * b2c3d4e (feature/login) feat: 사용자 검증 함수 추가
# | * a1b2c3d feat: 로그인 함수 추가
# |/
# * 9z8y7x6 (main) init: 프로젝트 시작

# 14. 실험 브랜치 생성 후 삭제
git switch main
git switch -c experiment/test
echo "test" > test.txt
git add .
git commit -m "test: 실험"

# 실험 실패로 가정, 삭제
git switch main
git branch -D experiment/test
# Deleted branch experiment/test (was d4e5f6g).

- 유용한 브랜치 명령어 정리

# 브랜치 목록
git branch              # 로컬 브랜치
git branch -r           # 원격 브랜치
git branch -a           # 전체 브랜치
git branch -v           # 상세 정보

# 브랜치 생성
git branch 브랜치명              # 생성만
git switch -c 브랜치명           # 생성 + 이동
git checkout -b 브랜치명         # 생성 + 이동 (구버전)

# 브랜치 이동
git switch 브랜치명              # 이동
git switch -                    # 이전 브랜치로

# 브랜치 삭제
git branch -d 브랜치명           # 삭제 (병합된 것만)
git branch -D 브랜치명           # 강제 삭제
git push origin --delete 브랜치명  # 원격 삭제

# 브랜치 이름 변경
git branch -m 새이름             # 현재 브랜치 이름 변경
git branch -m 기존이름 새이름     # 특정 브랜치 이름 변경

마무리

이번 시간에는 Git 브랜치의 개념과 생성/삭제 방법에 대해 알아봤습니다. 브랜치는 Git의 핵심 기능으로, 효율적인 협업과 안전한 개발을 가능하게 합니다. 브랜치를 자유롭게 만들고 삭제하는 연습을 충분히 하시길 추천드립니다.

다음 시간에는 브랜치 병합(Merge) 방법에 대해 알아보겠습니다.


참고 자료