[Git] 리모트 브랜치

앞서 리모트 저장소를 인터넷 어딘가에 위치한 외부 저장소라고 설명한적이 있다. 로컬 저장소의 브랜치를 알아봤으니, 리모트 저장소의 브랜치 또한 알아보자.

리모트 브랜치란?

워킹 디렉토리의 .git 폴더 속에는 refs 폴더가 있다. 리모트 refs는 리모트 저장소에 있는 포인터 및 레퍼런스이며, 리모트 저장소의 브랜치나 태그 등을 의미한다.

git ls-remote [remote] 명령를 통해 모든 리모트 refs를 조회할 수 있다.

Untitled

git remote show [remote] 명령을 통해 리모트 브랜치와 그 정보를 조회할 수 있다.

Untitled

사실 리모트 refs보다는 보통 리모트 트래킹 브랜치를 사용한다. 트래킹 브랜치는 일종의 북마크인데, 리모트 저장소에 마직막으로 연결했던 순간에 브랜치가 무슨 커밋을 가리키고 있었는지를 나타낸다.

리모트 북마트는 <remote>/<branch>의 형식으로 되어있다(ex:origin/master). origin은 리모트 저장소를 Clone 했을 때 자동으로 붙은 이름이며, master는 리모트 저장소의 내용을 내려받은 후 생성한 브랜치에 붙는 이름이다.


Fetch 사용 예시

Untitled

위와 같은 상황을 생각해보자. 리모트 저장소가 있고, 이를 로컬 저장소에 클론한 상태이다. 리모트 브랜치와 로컬 브랜치는 같은 커밋을 가리킨다. 리모트 저장소는 팀원과 함께 사용하고 있다.

Untitled

만약 내 팀원이 리모트 저장소에 Push하고, 나는 로컬 저장소에서만 커밋했다면, 서로 다른 커밋 히스토리가 쌓이게된다. 그림에서 f4265커밋 이후에 서로의 커밋 번호가 다른 모습이다. 아직 로컬과 리모트 저장소가 통신하지 않았으므로 origin/master포인터는 그대로이다.

Untitled

로컬브랜치를 리모트 저장소와 동기화 하고 싶다면 git fetch origin명령어를 사용하면 된다. 이 명령어는 현재의 로컬 저장소와 리모트 저장소를 비교하여 가지고 있지 않은 새로운 정보를 모두 내려받고, origin/master포인터를 최신 커밋으로 이동시킨다.

Untitled

새로운 리모트 저장소의 내용을 로컬 저장소가 가지고 있는 상황은 어떨까? 이미지 우측 상단에 teamone이라는 리모트 저장소를 추가하고 fetch했다. 결과는 새로 추가된 teamone/master포인터가 추가되는 모습이다.

이러한 포인터는 새로운 브랜치의 생성을 의미하지 않는다. 그저 수정할수 없는 브랜치 포인터가 생기는 것이다.

새로 받은 브랜치의 내용을 기존의 내용과 merge하려면 git merge origin/<병합할브랜치>처럼 명령어를 사용하면 된다.


Push 사용 예시

위와는 반대로 로컬 저장소에서 리모트 저장소로 push하는 경우를 알아보자. 로컬 저장소의 브랜치는 자동으로 리모트 저장소로 전송되지 않으며, 사용자가 명시적으로 push 해야한다. 따라서 전송을 원하지 않는 정보는 로컬 저장소에만 놔둘 수 있으며, 토픽 브랜치만을 전송할 수도 있다.

$ git push <remote> <branch>명령으로 push하면 어떤 일이 발생할까? git은 이 브랜치를 로컬 브랜치에서 리모트 브랜치로 업데이트한다. $ git push origin serverfix:awesomebranch명령어를 보면, 로컬의 serverfix 브랜치를 리모트의 awesomebranch로 push하라는 의미이다.


브랜치 추적(다시보기)

리모트 트래킹 브랜치를 로컬 브랜치로 체크아웃하면 자동으로 트래킹 브랜치가 생성된다(트래킹 대상 브랜치=Upstream branch). 리모트 저장소에 있던 브랜치를 로컬 저장소로 옮기면 트래킹 브랜치가 된다는 이야기이다. 이런 트래킹 브랜치에서 git pull하면 리모트 저장소로부터 데이터를 내려받아 연결된 리모트 브랜치와 자동으로 merge한다.

참고자료