안녕하세요! Git으로 프로젝트를 관리하다 보면 가끔씩 겪게 되는 소소한 불편함 중 하나가 바로 “유령 브랜치” 문제인데요. 팀 동료가 원격 저장소(예: GitHub)에서 이미 삭제한 브랜치가 내 로컬 Git 환경에는 origin/이제는-없는-브랜치
와 같은 형태로 계속 남아 목록을 어지럽히는 경우죠. 😱
분명히 서버에서는 지웠다고 하는데, 왜 내 컴퓨터에는 계속 보이는 걸까요? 그리고 이 보기 싫은 흔적들, 어떻게 하면 깔끔하게 정리할 수 있을까요? 오늘은 바로 이 문제의 원인과 해결 방법을 속 시원하게 알려드리겠습니다!
왜 이런 일이 생길까요? 🤔
Git에서 원격 저장소의 변경 사항을 가져올 때 주로 사용하는 명령어는 git fetch
입니다. 이 명령어는 기본적으로 원격 저장소의 새로운 정보(새로운 브랜치, 새로운 커밋 등)는 열심히 가져오지만, 원격에서 어떤 브랜치가 삭제되었다고 해서 내 로컬에 있는 해당 원격 브랜치의 복사본(정확히는 ‘원격 추적 브랜치’)을 자동으로 삭제해주지는 않습니다. 그래서 원격에서는 사라졌지만 내 로컬에는 그 ‘흔적’이 계속 남아있게 되는 것이죠.
이들을 정리할 수 있는 간단하고 효과적인 방법들이 있습니다.
git fetch –prune: 가장 기본적인 청소법! 🧹
가장 널리 사용되고 직접적인 방법은 git fetch 명령을 실행할 때 –prune (또는 줄여서 -p) 옵션을 함께 사용하는 것입니다. 이 옵션은 원격 저장소에서 더 이상 존재하지 않는 로컬의 원격 추적 브랜치들을 깔끔하게 삭제해 줍니다.
# 'origin' 원격 저장소의 최신 정보를 가져오면서,
# 'origin'에 더 이상 존재하지 않는 원격 추적 브랜치를 내 로컬에서 삭제합니다.
git fetch origin --prune
# 단축형 옵션도 동일하게 동작합니다.
git fetch origin -p
# 만약 여러 원격 저장소를 사용 중이라면 --all 옵션과 함께 사용할 수 있습니다.
git fetch --all --prune
예를 들어, 팀 프로젝트에서 'feature/old-login
‘ 브랜치가 원격에서 삭제되었다는 소식을 들었을 때, 터미널에 git fetch origin --prune
을 입력해보세요. 내 로컬 git branch -r
목록을 어지럽히던origin/feature/old-login
이 사라지는 것을 볼 수 있을 거예요!
git remote prune: 이미 workspace를 fetch/pull 했다면? 💨
만약 방금 git fetch를 –prune 옵션 없이 실행했거나, 단순히 정리 작업만 수행하고 싶다면 git remote prune <원격저장소이름>
명령을 사용할 수 있습니다.
# 'origin' 원격 저장소와 동기화하여,
# 'origin'에 더 이상 존재하지 않는 원격 추적 브랜치를 내 로컬에서 삭제합니다.
git remote prune origin
이 명령은 git fetch --prune
과 거의 동일한 청소 기능을 하지만, 원격으로부터 새로운 데이터를 가져오는 clone 과정 없이 순수하게 정리만 수행합니다. 혹시 어떤 브랜치들이 삭제될지 미리 확인하고 싶다면, -n
(또는 --dry-run
) 옵션을 추가해서 실행해보세요. 실제 삭제는 이루어지지 않고 결과만 보여줍니다.
# 실제로 삭제하지 않고, 어떤 브랜치가 삭제될지 미리 확인
git remote prune origin --dry-run
설정 한 번으로 자동 정리! (Workspace 설정) ⚙️
매번 --prune
옵션을 입력하는 것이 귀찮다고 느껴지신다면, Git 설정을 통해 git fetch
가 실행될 때마다 자동으로 prune
작업이 수행되도록 만들 수 있습니다.
# 현재 프로젝트의 'origin' 원격 저장소에 대해서만 fetch 시 항상 prune 하도록 설정
git config remote.origin.prune true
# 또는, 현재 컴퓨터의 모든 Git 프로젝트에서 fetch 시 항상 prune 하도록 전역(global) 설정 (추천!)
git config --global fetch.prune true
개인적으로는 전역 설정을 해두는 것을 선호합니다. 이렇게 설정해두면 어떤 프로젝트에서든 git fetch만 실행해도 알아서 깔끔하게 정리해주니 정말 편합니다! (이 설정은 Git 버전 1.8.5 이상부터 지원합니다.)
잠깐! 그럼 내 로컬 작업 브랜치는 어떻게 하죠?
여기서 한 가지 중요한 점! 위에서 설명드린 방법들은 원격 추적 브랜치(예: origin/feature-X
처럼 원격 저장소의 브랜치를 가리키는 로컬의 참조)만을 정리하는 것입니다. 만약 원격에서 삭제된 브랜치와 동일한 이름으로 내가 직접 생성해서 작업했던 로컬 브랜치(예: feature-X
)가 있다면, 이 로컬 브랜치는 위 명령어들로 자동으로 삭제되지 않습니다.
이런 로컬 브랜치들은 직접 상태를 확인하고 수동으로 삭제해주어야 합니다.
git branch -vv
명령을 사용하면 각 로컬 브랜치가 어떤 원격 브랜치를 추적하고 있는지, 그리고 원격 브랜치가 사라졌는지(: gone]) 등을 함께 보여줍니다.
git branch -vv
# 예시 출력:
# feature-A abcdef1 [origin/feature-A] Commit message A
# * feature-old uvwxyz7 [origin/feature-old: gone] Old commit message
# main 1234567 [origin/main] Latest main commit
위 예시에서 feature-old
브랜치는 원격 origin
에 해당 브랜치가 사라졌음(gone)을 알 수 있습니다.
더 이상 필요 없다고 판단되는 로컬 브랜치는 git branch -d <브랜치이름>
(병합된 브랜치만 안전하게 삭제) 또는 git branch -D <브랜치이름>
(병합되지 않아도 강제 삭제, 주의!) 명령으로 삭제할 수 있습니다.
# 'feature-old' 브랜치가 더 이상 필요 없다면 삭제
git branch -d feature-old
삭제하기 전에는 해당 로컬 브랜치에 아직 원격에 반영하지 않은 중요한 로컬 커밋이 남아있지는 않은지 다시 한번 확인하는 것이 좋습니다!
마무리
원격에서 삭제된 브랜치의 흔적이 로컬에 남아있는 것은 사소해 보일 수 있지만, 브랜치 목록이 길어지면 혼란을 주고 때로는 실수로 오래된 브랜치에서 작업을 시작하게 만들 수도 있습니다. 오늘 소개해드린 git fetch –prune 이나 prune 설정을 활용해서 여러분의 로컬 Git 저장소를 항상 최신의 깔끔한 상태로 유지해보세요! 혹시 여러분만의 더 좋은 Git 정리 팁이 있다면 댓글로 공유해주세요!
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."