github, gitlab과 같은 원격저장소에서는 머지가 끝난 브랜치를 자동으로 삭제하도록 설정하기도 합니다.
그러나 로컬에서 ref로 참조하고 있는 포인터들은 원격저장소의 그것과는 별도이기 때문에 사라지지 않습니다.
시험삼아 github의 rebase브랜치를 삭제해보겠습니다. git branch --all명령을 사용해보면 다음과 같은 그림이 표시될 겁니다.
rebase는 로컬브랜치이니 당연히 남아있지만, remotes/origin/rebase가 남아있습니다. 지금은 우선 원격저장소의 브랜치 삭제부터 반영해봅시다.
git fetch -p
/* 또는 */
git remote prune origin
git remote update --prune
둘은 같은 명령이 아닙니다.
- git fetch -p는 fetch의 옵션이기 때문에, 먼저 원격저장소의 모든 변경사항을 받아온 뒤 가지치기를 진행합니다.
- git remote prune origin은 변경사항을 확인하고 받아오지 않으면서 가지치기만 진행합니다.
이제 git branch -vv를 통해 각각의 브랜치에서 upstream이 사라졌는지 확인할 수 있습니다.
로컬 rebase브랜치에서 가리킬 remotes/origin/rebase브랜치가 사라졌기 때문에 : gone으로 표시되고 있습니다.
remote브랜치가 삭제된 로컬브랜치를 정리하기 위해서는 약간의 쉘 스크립트를 사용할 필요가 있습니다.
git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
해설해보자면 이렇습니다.
로컬브랜치를 정리하는데에는 다른 명령들을 사용해도 무방합니다. 다만 조건에 주의해주세요.
단순히 upstream이 없는 브랜치를 삭제하도록 명령하면 로컬에 생성했지만 아직 원격저장소와 연결되지 않은 브랜치도 함께 삭제될 겁니다. 이 명령어는 : gone]이 포함된 것만 삭제하기 때문에 그럴 우려가 없습니다.