포트폴리오로 만든 프로젝트를 관리하기 위해 GitHub에서 git clone 명령어로 리포지토리를 로컬로 가져오려고 했다. 그러나 git branch로 확인해보니 기본 브랜치만 나타나고 다른 브랜치가 나타나지 않았다. 보통 작업하던 로컬 컴퓨터를 바꾸고 작업할 때 종종 이 상황을 마주치게 될 것이다. 단순히 하나의 리포지토리를 클론할 때에는 git clone -b (브랜치 이름) (리포지토리 주소)를 하면 되지만, 이러면 브랜치에 있는 내용을 하나만 가져오기에 2개 이상의 브랜치를 바꿔가며 작업할 일이 생길 경우 문제가 된다. 이 경우 어떻게 해결해야 할까?
일단 착각하기 쉬운 잘못된 방법 하나를 소개하고, 제대로 된 방법을 소개하겠다.
단순히 git fetch --all이나 git pull --all을 하는 것은 이런 상황에 맞는 방법이 아니다. 단순히 clone 후 저걸 입력하게 되면 전자는 단순히 fetch를 통해 변경된 사항에 대한 설명/해시값 정도만 전체 내역으로 가져오고, 실제 파일을 가져오지 않는다. git pull --all도 비슷하다.
가령 원격 저장소 주소가 https://github.com/GilDong/example1.git이고 가져오고 싶은 브랜치의 이름이 feature/dblink라고 가정하겠다.
origin/(브랜치 이름) 형태를 띄고 있다(예: origin/feature/dblink).확인해보고 싶으면 git branch -a를 쳐보면 된다. 숨겨진 브랜치 정보를 드러내는 이 명령어를 보면 원격 리포지토리들이 전부 remotes/origin/ 접두어가 붙은 채 clone된 것을 볼 수 있다.
그러므로 예시의 경우 git checkout origin/feature/dblink로 HEAD를 옮긴다.
이때 대충 HEAD가 detach된 상태이며, 여기서 이 HEAD로 새로운 브랜치를 만들고 싶으면 git switch -c <new-branch-name>, 취소하려면 git checkout -을 쓰라는 안내문이 나오는데...
git switch -c feature/dblink
그럼 일단 feature/dblink 로컬 리포지토리가 따로 만들어진다.
3. 마지막으로 다음과 같이 작성한다.
git pull https://github.com/GilDong/example1.git
그러면 feature/dblink 리포지토리에 내용이 반영된다(참고로 ort strategy로 병합하면서 HEAD를 FETCH_HEAD로 옮겼다는 안내가 이때 뜬다).
이런 문제가 의외로 자주 있는지 hub라는 래퍼 플러그인이 있다. git에 추가하여 hub sync 명령어로 해결할 수도 있다.