CATEGORY

카테고리 (672)
AI (70)
Language & Specs (260)
FrameWork (36)
Library (20)
App (41)
Git (10)
Build & Dependency (2)
AWS (15)
DataBase (45)
OS (33)
Tool (17)
IT (120)
SEEMINGLY ONLINE

Seemingly
Online

이모저모 방방곡곡 두루두루 개발지식 저장소

RECENT POSTS

Git/Git

git 브랜치 삭제 — 로컬·원격과 안 지워질 때

반응형

로컬 브랜치는 git branch -d 브랜치, 원격은 git push origin --delete 브랜치로 지웁니다. 둘은 완전히 별개라서 로컬을 지워도 원격은 그대로 남습니다. 그리고 -d가 거부하며 not fully merged를 뱉는다면 그 브랜치의 커밋이 아직 어디에도 병합되지 않았다는 뜻이라, 정말 버릴 거면 -D로 강제해야 합니다. 아래 명령과 출력은 git 2.43.0에서 임시 저장소를 만들어 직접 실행한 결과입니다.

1. 로컬 브랜치 삭제 — -d와 -D

# 안전 삭제 (병합된 브랜치만)
git branch -d feature-login

# 강제 삭제 (병합 여부 무시)
git branch -D feature-login

공식 문서의 정의가 정확합니다. -d는 "브랜치를 삭제한다. 그 브랜치는 업스트림 브랜치에, 업스트림이 없다면 HEAD에 완전히 병합돼 있어야 한다"이고, -D는 "--delete --force의 축약"입니다.

성공하면 이렇게 나옵니다. 괄호 안의 값이 삭제된 브랜치의 마지막 커밋 해시인데, 뒤에서 복구할 때 씁니다.

$ git branch -d tmp-merged
Deleted branch tmp-merged (was e795276).
💡 한국어 환경에서는 같은 메시지가 tmp-merged 브랜치 삭제 (과거 e795276).처럼 번역돼 나옵니다. 표현만 다를 뿐 같은 결과입니다.

2. 안 지워질 때 — 오류 두 가지

not fully merged

$ git branch -d feature-unmerged
error: the branch 'feature-unmerged' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-unmerged'

그 브랜치에만 있는 커밋이 남아 있다는 뜻입니다. 지우기 전에 무엇이 남았는지부터 보세요.

# main에 없는 커밋만 보기
git log main..feature-unmerged --oneline

# 병합된 브랜치 / 안 된 브랜치 목록
git branch --merged main
git branch --no-merged main

확인했는데 정말 필요 없으면 -D로 지웁니다. 반대로 살릴 커밋이 있으면 먼저 병합하거나 git cherry-pick으로 옮긴 뒤 지우면 됩니다. 병합 자체가 꼬였다면 git merge 취소 글을 보세요.

cannot delete branch ... used by worktree

$ git branch -d main
error: cannot delete branch 'main' used by worktree at '/Users/me/projects/demo'

지금 체크아웃해 놓은 브랜치는 지울 수 없습니다. 다른 브랜치로 옮긴 뒤 지우면 됩니다. 워크트리를 여러 개 쓰고 있다면 그중 어느 하나가 잡고 있어도 같은 오류가 나므로, 오류 메시지에 찍힌 경로를 보고 그쪽에서 브랜치를 바꿔야 합니다.

git switch main          # 또는 git checkout main
git branch -d feature-login

작업 중인 변경 때문에 브랜치를 못 옮기겠다면 git stash 사용법으로 잠시 치워 두면 됩니다.

3. 원격 브랜치 삭제

git push origin --delete feature-login

# 같은 뜻의 옛 문법 (콜론 앞이 비어 있음 = 보낼 것이 없음 = 삭제)
git push origin :feature-login

공식 문서에도 "--delete: 나열된 모든 ref를 원격 저장소에서 삭제한다. 모든 ref 앞에 콜론을 붙이는 것과 같다"고 적혀 있습니다. 실행하면 이렇게 나옵니다.

$ git push origin --delete feature-remote
To ../origin.git
 - [deleted]         feature-remote
명령 지워지는 것 남는 것
git branch -d/-D 브랜치 내 로컬 브랜치 원격은 그대로
git push origin --delete 브랜치 원격 브랜치 내 로컬 브랜치는 그대로
git fetch --prune 사라진 원격을 가리키던 추적 참조 실제 브랜치는 안 건드림

4. 남이 지운 원격 브랜치가 목록에 계속 보일 때

내가 지운 경우에는 로컬의 origin/브랜치 참조도 같이 사라집니다. 문제는 다른 사람이 원격에서 지웠을 때입니다. 내 저장소에는 옛 정보가 그대로 남아 git branch -r에 계속 보입니다.

$ git branch -r
  origin/main
  origin/team-branch      # 이미 원격에는 없는 브랜치

$ git fetch --prune
From ../origin
 - [deleted]         (none)     -> origin/team-branch

$ git branch -r
  origin/main

매번 치기 번거로우면 아예 기본값으로 켜 둘 수 있습니다.

git config --global fetch.prune true

5. 실수로 지운 브랜치 복구

브랜치 삭제는 이름표를 떼는 것이지 커밋을 지우는 게 아닙니다. 그래서 해시만 알면 그대로 되살아납니다. 그 해시가 바로 삭제할 때 출력된 괄호 안 값입니다.

$ git branch -D team-branch
Deleted branch team-branch (was 352072b).

$ git branch team-branch 352072b      # 같은 자리에 다시 만들기

출력을 이미 닫아 버렸다면 git reflog에서 찾습니다.

$ git reflog
e795276 HEAD@{0}: checkout: moving from team-branch to main
352072b HEAD@{1}: commit: e
e795276 HEAD@{2}: checkout: moving from main to team-branch

브랜치에서 마지막으로 만든 커밋(commit: 줄)의 해시를 골라 git branch 이름 해시로 되살리면 됩니다.

6. 병합 끝난 브랜치 한 번에 정리하기

# 먼저 무엇이 지워질지 눈으로 확인
git branch --merged main

# 확인했으면 실행 (현재 브랜치와 main, develop은 제외)
git branch --merged main | grep -vE '^\*|main|develop' | xargs -r git branch -d
⚠️ 목록을 먼저 보지 않고 실행하지 마세요. --merged는 지금 기준 브랜치에 병합된 것을 뜻하므로, 기준을 잘못 잡으면 아직 살아 있어야 할 브랜치가 목록에 들어옵니다. 그래도 -d(대문자 아님)를 쓰면 병합 안 된 브랜치는 거부되므로 한 겹 안전장치가 됩니다.

자주 묻는 질문 (FAQ)

Q. 로컬을 지웠는데 왜 깃허브에는 그대로 있나요?
로컬 브랜치와 원격 브랜치는 별개이기 때문입니다. 원격에서도 지우려면 git push origin --delete 브랜치를 따로 실행해야 합니다.

Q. -d와 -D는 뭐가 다른가요?
-D는 --delete --force의 축약입니다. 즉 병합 여부를 확인하지 않고 지웁니다. 평소에는 -d를 쓰고, 거부당했을 때만 내용을 확인한 뒤 -D로 넘어가는 순서가 안전합니다.

Q. 브랜치를 지우면 커밋도 사라지나요?
바로 사라지지는 않습니다. 브랜치는 커밋을 가리키는 이름표라, 해시만 있으면 되살릴 수 있습니다(5장). 다만 아무 곳에서도 참조하지 않는 커밋은 나중에 정리(gc) 대상이 되므로 무한정 남아 있지는 않습니다.

Q. 원격 브랜치를 지웠는데 팀원 화면에는 계속 보입니다.
그 팀원의 로컬에 옛 추적 참조가 남아 있어서입니다. git fetch --prune을 실행하면 정리됩니다.

마무리

정리하면 이렇습니다. ① 로컬은 git branch -d, 원격은 git push origin --delete, 둘은 따로입니다. ② not fully merged는 안 합쳐진 커밋이 있다는 신호이니 git log main..브랜치로 먼저 확인합니다. ③ 체크아웃 중인 브랜치는 못 지웁니다. ④ 남이 지운 원격은 git fetch --prune으로 정리합니다. ⑤ 실수로 지웠다면 삭제 메시지의 해시나 git reflog로 되살립니다.


📚 참고 출처 (2026년 7월 29일 확인 · git 2.43.0 실행)
· Git 공식 문서 — git-branch
· Git 공식 문서 — git-push

반응형

COMMENTS