[Git] 리모트 브랜치

업데이트:     Updated:

카테고리:

태그:

🎯리모트 브랜치

리모트 Refs는 리모트 저장소에 있는 포인터인 레퍼런스다. 리모트 저장소에 있는 브랜치, 태그 등등을 의미한다. git ls-remote [remote] 명령으로 모든 리모트 Refs를 조회할 수 있다. git remote show [remote] 명령은 모든 리모트 브랜치와 그 정보를 보여준다.

리모트 Refs가 있지만 보통은 리모트 트래킹 브랜치를 사용한다. 리모트 트래킹 브랜치는 리모트 브랜치를 추적하는 레퍼런스이며 브랜치다. 리모트 트래킹 브랜치는 로컬에 있지만 임의로 움직일 수 없다. 리모트 서버에 연결할 때마다 리모트의 브랜치 업데이트 내용에 따라서 자동으로 갱신될 뿐이다.

리모트 트래킹 브랜치의 이름은 <remote>/<branch> 형식으로 되어 있다. 예를 들어 리모트 저장소 originmaster 브랜치를 보고 싶다면 origin/master 라는 이름으로 브랜치를 확인하면 된다.

워크플로

git.ourcompany.com 이라는 Git 서버가 있고 이 서버의 저장소를 하나 Clone 하면 Git은 자동으로 origin 이라는 이름을 붙인다. origin 으로부터 저장소 데이터를 모두 내려받고 master 브랜치를 가리키는 포인터를 만든다. 이 포인터는 origin/master 라고 부르고 멋대로 조종할 수 없다. 그리고 GIt은 로컬의 master 브랜치가 origin/master 를 가리키게 한다. 이제 이 master 브랜치에서 작업을 시작할 수 있다.

  1. git.ourcompany.com 서버로 부터 저장소 데이터를 모두 Clone image
  2. 로컬 저장소 및 원격 저장소에 커밋 추가 image
  3. git fatch origin 명령을 실행하여 현재 로컬 저장소에 갖고 있지 않은 새로운 정보를 모두 내려 받고, 받은 데이터를 로컬 저장소에 업데이트하고 나서, origin/master 포인터의 위치를 최신 커밋으로 이동시킨다. image
  4. git remote add 명령으로 git.team1.ourcompany.com Git 서버를 추가한다. 이름은 teamone으로 한다. image
  5. git fetch teamone 명령으로 teamone 서버의 데이터를 내려받는다. 이때 teamon 서버의 데이터는 모두 origin 리모트 서버에도 있는 것들이라서 아무것도 내려받지 않는다. 하지만, 이 명령은 리모트 트래킹 브랜치인 teamone/masterteamone 서버의 master 브랜치가 가리키는 커밋을 가리키게 한다. image

Push

로컬의 브랜치를 서버로 전송하려면 쓰기 권한이 있는 리모트 저장소에 Push 해야 한다. 로컬 저장소의 브랜치는 자동으로 리모트 저장소로 전송되지 않는다. 명시적으로 브랜치를 Push 해야 정보가 전송된다.

예를 들어, serverfix 라는 브랜치를 다른 사람과 공유하기 위해 리모트 서버에 Push 하는 경우 다음과 같이 git remote push serverfix 명령을 사용한다.

이때 Git은 serverfix라는 브랜치 이름을 refs/heads/serverfix:refs/heads/serverfix로 확장한다. 이것은 serverfix라는 브랜치를 서버로 Push 하는데 리모트의 serverfix 브랜치로 업데이트한다는 것을 의미한다.

git push origin serverfix:serverfix라고 Push 하는 것도 같은 의미인데 이것은 “로컬의 serverfix 브랜치를 리모트 저장소 serverfix 브랜치로 Push 하라” 라는 뜻이다. 로컬 브랜치의 이름과 리모트 서버의 브랜치 이름이 다를 때 이 방법이 유요하다. 예를 들어 리모트 저장소에 serverfix 라는 이름 대신 다름 이름을 사용하려면 git push origin serverfix:awesomebranch 처럼 사용한다.

Fetch

Fetch 명령으로 리모트 트래킹 브랜치를 내려받는다고 해서 로컬 저장소에 수정할 수 있는 브랜치가 새로 생기는 것이 아니다. 다시 말해서 serverfix라는 브랜치가 생기는 것이 아니라 그저 수정할 수 없는 origin/serverfix 브랜치 포인터가 생기는 것이다.

또한 fetch 명령은 Pull 명령과 달리 자동으로 Merge를 수행하지 않는다. 새로 받은 브랜치의 내용을 Merge 하려면 git merge origin/serverfix 명령을 사용해야 한다. Merge 하지 않고 리모트 트래킹 브랜치에서 시작하는 새 브랜치를 만들려면 아래와 같은 명령을 사용한다. 그러면 origin/serverfix 에서 시작하고 수정할 수 있는 serverfix 라는 로컬 브랜치가 만들어진다.

$ git checkout -b serverfix origin/serverfix

브랜치 추적

리모트 트래킹 브랜치를 로컬 브랜치로 Checkout 하면 자동으로 “트래킹 브랜치”가 만들어진다. 트래킹 브랜치는 리모트 브랜치와 직접적인 연결고리가 있는 로컬 브랜치이다. 트래킹 브랜치에서 git pull 명령을 내리면 리모트 저장소로부터 데이터를 내려받아 연결된 리모트 브랜치와 자동으로 Merge 한다.

서버로부터 저장소를 Clone 하면 Git은 자동으로 master 브랜치를 origin/master 브랜치의 트래킹 브랜치로 만든다. git checkout -b <branch> <remote>/<branch> 명령으로 트래킹 브랜치를 직접 만들 수도 있다. 또한 간단한 방법도 있다.

  • --track 옵션을 사용하면 로컬 트래킹 브랜치를 Git에서 자동으로 생성해준다. 이때 로컬 트래킹 브랜치의 이름은 리모트 저장소의 브랜치 이름과 같다.
    $ git checkout --track origin/serverfix
    Branch serverfix set up to track remote branch serverfix from origin.
    Switched to a new branch 'serverfix'
    
  • 만약 사용중인 프로젝트에서 입력한 브랜치 이름을 사용하는 리모트가 딱 하나 있고 해당 브랜치가 로컬에 없는 경우 다음의 명령은 Git이 트래킹 브랜치를 자동으로 만들어 준다.
    $ git checkout serverfix
    Branch serverfix set up to track remote branch serverfix from origin.
    Switched to a new branch 'serverfix'
    
  • 리모트 브랜치와 다른 이름으로 로컬 트래킹 브랜치를 만들려면 로컬 브랜치의 이름을 다음과 같이 다르게 지정한다.
    $ git checkout -b sf origin/serverfix
    Branch sf set up to track remote branch serverfix from origin.
    Switched to a new branch 'sf
    

이미 로컬에 존재하는 브랜치가 리모트의 특정 브랜치를 추적하게 하려면 해당 브랜치로 Checkout 하고 git branch 명령에 -u--set-upstream-to 옵션을 붙여서 사용한다. git branch -u <remote>/<branch>

이제 로컬 트래킹 브랜치에서 Push나 Pull 명령을 수행하면 자동으로 <remote>/<branch>로 데이터를 보내거나 가져온다.

브랜치 추적 확인

추적 브랜치가 현재 어떻게 설정되어 있는지 확인하려면 git branch 명령에 -vv 옵션을 더한다. 이 명령을 실행하면 로컬 브랜치 목록과 로컬 브랜치가 추적하고 있는 리모트 브랜치도 함께 보여준다. 게다가 로컬 브랜치가 앞서가는지 뒤쳐지는지에 대한 내용도 보여준다.

$ git branch -vv
  iss53     7e424c3 [origin/iss53: ahead 2] forgot the brackets
  master    1ae2a45 [origin/master] deploying index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
  testing   5ea463a trying something new

위의 결과를 보면 iss53 브랜치는 origin/iss53 리모트 브랜치를 추적하고 있다는 것을 알 수 있고 ahead 표시를 통해 로컬 브랜치가 커밋 2개 앞서 있다는 것을 알 수 있다. master 브랜치는 origin/master 브랜치를 추적하고 있으며 두 브랜치가 가리키는 커밋 내용이 같은 상태이다. 로컬 브랜치 중 serverfix 브랜치는 server-fix-good 이라는 teamone 리모트 서버의 브랜치를 추적하고 있으며 커밋 3개 앞서 있으며 동시에 커밋 1개 뒤쳐져 있다. 이 말은 serverfix 브랜치에 서버로 보내지 않은 커밋이 3개, 서버의 브랜치에서 아직 로컬 브랜치로 머지하지 않은 커밋이 1개 있다는 말이다. 마지막 testing 브랜치는 추적하는 브랜치가 없는 상태이다.

여기서 중요한 점은 명령을 실행했을 때 나타나는 결과는 모두 마지막으로 서버에서 데이터를 가져온(fetch) 시점을 바탕으로 계산한다는 점이다. 단순히 이 명령만으로는 서버의 최신 데이터를 반영하지는 않으며 로컬에 저장된 서버의 캐시 데이터를 사용한다. 현재 시점에서 진짜 최신 데이터로 추적 상황을 알아보려면 먼저 서버로부터 최신 데이터를 받아온 후에 추적 상황을 확인해야 한다. 다음처럼 두 명령을 이어서 사용하는 것이 적당하다. git fetch --all: git branch -vv

Pull

git fetch 명령을 실행하면 서버에는 존재하지만, 로컬에는 아직 없는 데이터를 받아와서 저장한다. 이때 워킹 디렉토리의 파일 내용은 변경되지 않고 그대로 남는다. 서버로부터 데이터를 가져와서 저장해두고 사용자가 Merge 하도록 준비만 해둔다. 간단히 말하면 git pull 명령은 대부분 git fetch 명령을 실행하고 나서 자동으로 git merge 명령을 수행하는 것 뿐이다. clone이나 checkout 명령을 실행하여 추적 브랜치가 설정되면 git pull 명령은 서버로부터 데이터를 가져와서 현재 로컬 브랜치와 서버의 추적 브랜치를 Merge 한다.

일반적으로 fetchmerge 명령을 명시적으로 사용하는 것이 pull 명령으로 한번에 두 작업을 하는 것보다 낫다.

리모트 브랜치 삭제

이제 더 이상 필요하지 않은 리모트 브랜치는 git push 명령에 --delete 옵션을 사용하여 삭제할 수 있다. serverfix 라는 리모트 브랜치를 삭제하려면 아래와 같이 실행한다. 이 명령을 수행하면 서버에서 브랜치 하나가 사라진다.

$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
 - [deleted]         serverfix

📌출처

Git Docs


👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

git 카테고리 내 다른 글 보러가기

댓글남기기