git branch
List, create, or delete branches
— Git 공식 매뉴얼(man git-branch)
평행 우주를 개척하는 행위이며, 결국엔 본 차원에 충돌이라는 비극을 몰고 올 우주 파괴의 주범. 브랜치 이름만 50개인데, 대체 각각 무슨 기능을 만들던 건지 아무도 모른다(...)
1. 개요
독립적인 작업 흐름을 생성하여, 한 저장소 안에서 여러 작업을 동시에 병렬로 진행할 수 있게 보장해주는 기능이자 관리 명령이다. 메인 줄기인 main/master에 영향을 주지 않고 안전하게 기능 구현, 버그 패치, 신기술 도입 등을 시험해 볼 수 있는 가장 위대한 발명품 중 하나다.
2. 포인터에 불과한 깃의 브랜치
이전 버전 관리 시스템(SVN 등)과 비교할 때 Git 브랜치의 혁신성은 가벼움에 있다. SVN은 브랜치를 만들 때 실제로 디렉터리를 물리적으로 복사하여 용량을 폭식하는 미련한 짓을 했지만, Git은 단지 특정 커밋을 가리키는 40자리 해시값이 담긴 아주 가벼운 포인터 파일 하나만 생성할 뿐이다. 덕분에 1초 만에 브랜치를 수천 개도 넘게 찍어낼 수 있는 성능을 자랑한다.1
3. 유령선들의 무덤: 브랜치 관리의 필요성
쉽게 만들 수 있는 만큼 쉽게 버려진다. 기능 하나를 구현하고 메인에 병합(Merge)하고 나면, 작업했던 브랜치는 조용히 삭제해 주는 것이 인지상정이다. 하지만 게으른 성격 탓에 git branch -d 명령을 소홀히 한 채 방치하면, 저장소는 금새 정체불명의 고대 잔해 브랜치 수백 개로 오염되어 난장판이 된다. 이럴 때는 git branch --merged를 쳐서 제때 썩은 브랜치들을 도려내는 단호함이 필요하다.
4. 실제 사용 예시
브랜치 목록을 보고, 새 브랜치를 만들고, 필요 없어진 브랜치를 정리하는 기본 명령들이다.
# 로컬 브랜치 목록
git branch
# 새 브랜치 만들기
git branch feature/login
# 병합이 끝난 브랜치 삭제
git branch -d feature/login
브랜치 이름을 바꿀 때는 -m을 쓴다. 현재 브랜치의 이름을 바꾸는 경우에는 새 이름만 적으면 된다.
git branch -m old-name new-name
git branch -m feature/auth
5. 관련 밈 및 드립
5.1. 실시간 배포용 브랜치 대참사
회사에서 정신줄을 놓고 실시간 서비스가 구동 중인 production이나 main 브랜치에 직접 커밋을 날리거나 강제 푸시를 때려 한순간에 전 세계 결제 시스템을 마비시키는 밈이다. 이 행위를 저지른 날 밤에는 대개 짐을 싸거나 사유서 양식을 검색하게 된다.
5.2. 브랜치 작명소
공식 기능 브랜치 명명 규칙(feature/login)을 무시하고, 개발자들의 감정을 듬뿍 담은 feature/jebal-work-please 또는 fix/this-is-really-real-final 같은 처절하고 구구절절한 작명을 갈겨놓아 팀원들에게 조리돌림당하는 현상이다.
6. 여담
- 삭제 경고: 아직 메인에 병합되지 않은 무언가 들어있는 브랜치를 지우려 하면
git branch -d는 에러를 뱉으며 철통같이 보호해 준다. 억지로 지우려면 대문자-D를 써서 모가지를 비틀어야 한다. - 로컬 vs 원격: 내 컴퓨터에만 살아 있는 로컬 브랜치와 깃허브 서버에 박혀 있는 리모트 브랜치는 엄연히 다르기 때문에 둘 사이에 동기화(Tracking)를 맺어 주어야 편안한 깃 생활이 영위된다.
- 무덤 속에서 부활: 실수로 삭제한 브랜치도 git reflog를 통해 커밋 해시만 확보하면 언제든 예수님마냥 부활시킬 수 있으니 땀 흘리지 않아도 된다.