포스트

[GitHub 100일 챌린지] Day 45 - 브랜치 삭제하기

[GitHub 100일 챌린지] Day 45 - 브랜치 삭제하기

100일 챌린지 Day 45 - 불필요한 브랜치를 안전하게 삭제하는 방법을 배웁니다.

배울 내용

  1. 로컬 브랜치 삭제
  2. 원격 브랜치 삭제
  3. 브랜치 삭제 안전 가이드

Topic1. 로컬 브랜치 삭제

병합 완료된 브랜치는 삭제해서 깔끔하게 관리합니다.

기본 브랜치 삭제

git branch -d 안전한 삭제:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 브랜치 목록 확인
git branch

# 출력:
  feature/login
  feature/payment
* main

# 병합 완료된 브랜치 삭제
git branch -d feature/login

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

# 재확인
git branch

# 출력:
  feature/payment
* main

-d 옵션의 안전장치:

1
2
3
4
5
6
# 병합하지 않은 브랜치 삭제 시도
git branch -d feature/payment

# 에러 발생!
error: The branch 'feature/payment' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature/payment'.

Git이 삭제를 막는 이유:

  • 병합되지 않은 커밋이 있음
  • 삭제 시 커밋 내용이 영구 손실됨
  • 안전을 위해 경고 메시지 표시

강제 삭제 (주의!)

git branch -D 강제 삭제:

1
2
3
4
5
6
7
# 병합하지 않아도 강제 삭제
git branch -D feature/experimental

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

# ⚠️ 경고: 커밋 내용이 완전히 사라짐!

언제 강제 삭제를 사용하나요?:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 사례 1: 실험적 브랜치 폐기
git checkout -b experiment/new-ui
# ... 실험했지만 실패 ...
git checkout main
git branch -D experiment/new-ui  # 버려도 됨

# 사례 2: 잘못 시작한 브랜치
git checkout -b fearure/login  # 오타!
git checkout -b feature/login  # 올바른 브랜치
git branch -D fearure/login    # 오타 브랜치 삭제

# 사례 3: PR 거부된 브랜치
# Pull Request가 거부되어 폐기하기로 함
git branch -D feature/rejected-proposal

해보기: 브랜치 정리 실습

시나리오: 개발 완료 후 브랜치 정리

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
# 프로젝트 설정
mkdir branch-cleanup-demo
cd branch-cleanup-demo
git init

echo "# Main Project" > README.md
git add README.md
git commit -m "Initial commit"

# Feature 1: 로그인 (완료)
git checkout -b feature/login
echo "Login complete" > login.js
git add login.js
git commit -m "Complete login feature"

# main에 병합
git checkout main
git merge feature/login

# Feature 1 브랜치 삭제 (안전)
git branch -d feature/login
# ✅ Deleted branch feature/login

# Feature 2: 실험적 기능 (실패)
git checkout -b experiment/new-design
echo "Experimental design" > design.css
git add design.css
git commit -m "Try new design"

# main으로 돌아가기 (병합 안 함!)
git checkout main

# 실험 브랜치 삭제 시도
git branch -d experiment/new-design
# ❌ Error: not fully merged

# 강제 삭제
git branch -D experiment/new-design
# ✅ Deleted branch experiment/new-design (커밋 손실!)

# Feature 3: 개발 중 (유지)
git checkout -b feature/payment
echo "Payment in progress" > payment.js
git add payment.js
git commit -m "WIP: Payment feature"

# main으로 돌아가기
git checkout main

# 최종 브랜치 상태
git branch

# 출력:
  feature/payment  (개발 중 - 유지)
* main

결과

브랜치 삭제 규칙:

1
2
3
4
✅ 병합 완료 → git branch -d (안전)
⚠️ 병합 안 됨 → 내용 확인 후 결정
❌ 버려도 됨 → git branch -D (강제)
🔄 개발 중 → 유지

삭제 전 확인사항:

1
2
3
4
5
6
7
8
9
# 1. 브랜치 내용 확인
git log feature/login --oneline

# 2. main과 차이 확인
git log main..feature/login

# 3. 병합 여부 확인
git branch --merged
git branch --no-merged

Topic2. 원격 브랜치 삭제

GitHub에 푸시한 브랜치도 정리해야 합니다.

원격 브랜치 삭제 방법

방법 1: git push 사용:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 원격 브랜치 확인
git branch -r

# 출력:
origin/main
origin/feature/login
origin/feature/payment

# 원격 브랜치 삭제
git push origin --delete feature/login

# 출력:
To github.com:username/repo.git
 - [deleted]         feature/login

# 재확인
git branch -r

# 출력:
origin/main
origin/feature/payment

방법 2: 축약 문법:

1
2
3
4
5
6
# 콜론(:) 문법
git push origin :feature/payment

# 동일한 결과:
To github.com:username/repo.git
 - [deleted]         feature/payment

방법 3: GitHub UI에서 삭제:

  1. GitHub 저장소 페이지 이동
  2. “Branches” 탭 클릭
  3. 삭제할 브랜치 옆 휴지통 아이콘 클릭
  4. “Delete branch” 확인

로컬 + 원격 동시 삭제

완전한 브랜치 제거:

1
2
3
4
5
6
7
8
9
# 1. 로컬 브랜치 삭제
git branch -d feature/completed

# 2. 원격 브랜치 삭제
git push origin --delete feature/completed

# 또는 한 번에:
git branch -d feature/completed && \
git push origin --delete feature/completed

삭제 후 정리:

1
2
3
4
5
6
7
# 원격 브랜치 정보 업데이트
git fetch --prune

# 또는 (동일한 효과)
git remote prune origin

# 삭제된 원격 브랜치 참조 제거됨

해보기: 원격 브랜치 정리

시나리오: PR 병합 후 브랜치 정리

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
# GitHub 저장소가 있다고 가정
git clone https://github.com/username/myproject.git
cd myproject

# 새 기능 개발
git checkout -b feature/new-feature
echo "New feature" > feature.js
git add feature.js
git commit -m "Add new feature"

# GitHub에 푸시
git push -u origin feature/new-feature

# Pull Request 생성 및 병합 (GitHub에서)
# ...

# 로컬에서 main 업데이트
git checkout main
git pull origin main

# === 정리 시작 ===

# 1. 로컬 브랜치 삭제
git branch -d feature/new-feature

# 2. 원격 브랜치 삭제
git push origin --delete feature/new-feature

# 3. 원격 참조 정리
git fetch --prune

# 4. 최종 확인
git branch -a

# 출력:
* main
  remotes/origin/main
# (feature/new-feature가 완전히 사라짐!)

결과

원격 브랜치 정리 프로세스:

graph LR
    A[기능 개발] --> B[PR 생성]
    B --> C[코드 리뷰]
    C --> D[PR 병합]
    D --> E[로컬 브랜치 삭제]
    E --> F[원격 브랜치 삭제]
    F --> G[fetch --prune]

정리 효과:

1
2
3
4
✅ GitHub 저장소가 깔끔해짐
✅ 팀원들이 혼란스러워하지 않음
✅ 브랜치 목록이 관리 가능한 수준 유지
✅ 저장소 용량 최적화

Topic3. 브랜치 삭제 안전 가이드

브랜치를 안전하게 삭제하는 체크리스트입니다.

삭제 전 확인사항

체크리스트:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ✅ 1. 병합 여부 확인
git branch --merged
# 출력에 있으면 안전하게 삭제 가능

git branch --no-merged
# 출력에 있으면 주의 필요

# ✅ 2. 브랜치 내용 확인
git log feature/example --oneline -5
# 마지막 5개 커밋 확인

# ✅ 3. main과의 차이 확인
git log main..feature/example
# main에 없는 커밋 확인

# ✅ 4. 파일 변경 내역 확인
git diff main...feature/example
# 실제 코드 변경사항 확인

실수 복구 방법

삭제한 브랜치 복구하기:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 실수로 브랜치 삭제
git branch -D feature/important

# 삭제 메시지에서 커밋 해시 확인:
# Deleted branch feature/important (was a1b2c3d).

# 커밋 해시로 브랜치 복구!
git branch feature/important a1b2c3d

# 또는 reflog 사용
git reflog
# 출력에서 해당 브랜치의 마지막 커밋 찾기

# HEAD@{5}: commit: Last commit in feature/important
git branch feature/important HEAD@{5}

reflog를 이용한 복구 (고급):

1
2
3
4
5
6
7
8
9
10
11
12
13
# 삭제한 브랜치의 커밋 찾기
git reflog

# 출력 예시:
a1b2c3d HEAD@{0}: checkout: moving from feature/deleted to main
b2c3d4e HEAD@{1}: commit: Last change in deleted branch
c3d4e5f HEAD@{2}: commit: Previous commit

# 브랜치 재생성
git branch feature/restored b2c3d4e

# 확인
git log feature/restored --oneline

대량 브랜치 정리

병합된 브랜치 일괄 삭제:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 병합된 브랜치 목록
git branch --merged | grep -v "\*" | grep -v "main"

# 출력 예시:
feature/completed-1
feature/completed-2
hotfix/old-bug

# 일괄 삭제 (확인 후!)
git branch --merged | \
  grep -v "\*" | \
  grep -v "main" | \
  xargs -n 1 git branch -d

# 출력:
Deleted branch feature/completed-1
Deleted branch feature/completed-2
Deleted branch hotfix/old-bug

오래된 원격 브랜치 확인:

1
2
3
4
5
6
7
8
# 30일 이상 된 브랜치 찾기
git for-each-ref --sort=-committerdate refs/remotes/ \
  --format='%(refname:short) %(committerdate:relative)'

# 출력:
origin/main         2 days ago
origin/feature/new  5 days ago
origin/feature/old  2 months ago  ← 삭제 고려

해보기: 안전한 대청소

시나리오: 프로젝트 정리 작업

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
# === 현재 상태 ===
git branch -a

# 출력:
* main
  feature/completed-login
  feature/completed-payment
  feature/in-progress-search
  experiment/failed-attempt
  remotes/origin/main
  remotes/origin/feature/old-feature

# === 1. 병합된 로컬 브랜치 확인 ===
git branch --merged

# 출력:
  feature/completed-login
  feature/completed-payment
* main

# === 2. 병합 안 된 브랜치 확인 ===
git branch --no-merged

# 출력:
  feature/in-progress-search  ← 개발 중 (유지)
  experiment/failed-attempt   ← 실패 (삭제 고려)

# === 3. 실패한 실험 브랜치 내용 확인 ===
git log experiment/failed-attempt --oneline

# 필요 없으면 강제 삭제
git branch -D experiment/failed-attempt

# === 4. 병합된 브랜치 안전 삭제 ===
git branch -d feature/completed-login
git branch -d feature/completed-payment

# === 5. 원격 정리 ===
git push origin --delete feature/old-feature

# === 6. 원격 참조 업데이트 ===
git fetch --prune

# === 7. 최종 상태 확인 ===
git branch -a

# 출력:
  feature/in-progress-search  (개발 중 - 유지)
* main
  remotes/origin/main

결과

안전한 브랜치 관리 규칙:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1. 병합 전 확인
   ├─ git branch --merged 사용
   ├─ PR 상태 확인
   └─ 팀원과 소통

2. 삭제 전 백업
   ├─ 커밋 해시 기록
   ├─ 중요 브랜치는 태그 생성
   └─ 불확실하면 보류

3. 정기적인 정리
   ├─ 주 1회 병합된 브랜치 정리
   ├─ 월 1회 원격 브랜치 검토
   └─ 분기 1회 대규모 정리

4. 복구 방법 숙지
   ├─ reflog 사용법 알기
   ├─ 커밋 해시 보관
   └─ 30일 내 복구 가능

브랜치 수명 주기:

graph TD
    A[브랜치 생성] --> B[개발 작업]
    B --> C{완료?}
    C -->|Yes| D[PR 생성]
    C -->|No| B
    D --> E[코드 리뷰]
    E --> F{승인?}
    F -->|Yes| G[main 병합]
    F -->|No| B
    G --> H[로컬 브랜치 삭제]
    H --> I[원격 브랜치 삭제]
    I --> J[fetch --prune]

정리

오늘 배운 내용:

1. 로컬 브랜치 삭제:

1
2
3
4
git branch -d [브랜치]    # 안전 삭제 (병합된 것만)
git branch -D [브랜치]    # 강제 삭제 (주의!)
git branch --merged       # 병합된 브랜치 목록
git branch --no-merged    # 병합 안 된 브랜치

2. 원격 브랜치 삭제:

1
2
3
git push origin --delete [브랜치]  # 원격 삭제
git push origin :[브랜치]         # 축약 문법
git fetch --prune                 # 참조 정리

3. 안전 가이드:

  • 삭제 전 병합 여부 확인
  • 중요 브랜치는 커밋 해시 기록
  • reflog로 복구 가능 (30일 이내)
  • 정기적인 브랜치 정리 습관

다음 단계: Day 46에서 Fast-Forward 병합을 배웁니다.

완료 체크:

  • 로컬 브랜치를 안전하게 삭제할 수 있다
  • 원격 브랜치를 정리할 수 있다
  • 실수로 삭제한 브랜치를 복구할 수 있다

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.