[GitHub 100일 챌린지] Day 45 - 브랜치 삭제하기
[GitHub 100일 챌린지] Day 45 - 브랜치 삭제하기
100일 챌린지 Day 45 - 불필요한 브랜치를 안전하게 삭제하는 방법을 배웁니다.
배울 내용
- 로컬 브랜치 삭제
- 원격 브랜치 삭제
- 브랜치 삭제 안전 가이드
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에서 삭제:
- GitHub 저장소 페이지 이동
- “Branches” 탭 클릭
- 삭제할 브랜치 옆 휴지통 아이콘 클릭
- “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 라이센스를 따릅니다.
