[Git] 리모트 브랜치

안녕하세요 리모트 브랜치에 대한 포스팅입니다.

리모트 브랜치

리모트 Ref (자주 쓰이지 않음)

리모트 브랜치에 대해서 공부하기전에 리모트 Ref에 대해서 간단하게만 알아보겠습니다.
리모트 Ref보단 리모트 트래킹 브랜치가 자주 쓰입니다.
리모트 Ref는 리모트 저장소에 있는 포인터인 레퍼런스 를 말하는데 리모트 저장소의 브랜치, 태그 등을 가리킵니다.

Ref 목록을 보는 방법입니다.

$ git ls-remote
From https://github.com/schacon/simplegit-progit
ca82a6dff817ec66f44342007202690a93763949        HEAD
ca82a6dff817ec66f44342007202690a93763949        refs/heads/master
655e054b11249c13ffe609fd639001c8908e1d8b        refs/pull/1/head
473dca920109e263a2f5b57dda05b813846cd080        refs/pull/1/merge
ea414e04932ad8858f6680a300da87a9baef3190        refs/pull/2/head
46ca2a58bc31dcd6de69a1bef99fcc9f38d7f5c6        refs/pull/2/merge
9255f8707f899067bb60d736f0f8444993ee11ea        refs/pull/3/head
02d3b10fdfffa65e009134cf95837f76fb4504a8        refs/pull/3/merge
ebf74e67d2a75e3d96122f11f0080dd26c9e0938        refs/pull/4/head
f90007f40e3c89d3d989329c2bb024b9a675e7db        refs/pull/5/head
40f6ebce8bcf5204990288c7155ddff6216a2c2e        refs/pull/6/head

이런 식으로 https://github.com/schacon/simplegit-progit 리모트 저장소에 있는 Ref들을 볼 수 있습니다.

리모트 트래킹 브랜치

리모트 트래킹 브랜치는 리모트 브랜치를 추적하는 브랜치 입니다.
리모트 트래킹 브랜치는 리모트 서버에 연결할 때마다 리모트 브랜치에 따라서 자동으로 움직이게 됩니다.
리모트 저장소의 마지막으로 연결했던 순간에 리모트 브랜치가 무슨 커밋을 가리키고 있었는지를 나타냅니다.

리모트 저장소, 리모트 브랜치, 리모트 트래킹 브랜치를 정확히 알아야 이해하기 쉽습니다.

  • 리모트 브랜치 - (remote) / (branch) 형식으로 되어있습니다. 리모트 저장소 origin의 master브랜치라면 origin / master 가 됩니다.

달라질 수 있는 리모트 브랜치

로컬 저장소에서 어떤 작업을 하고 있는데 동시에 다른 팀원이 git.ourcompany.com라고 하는 어떤 서버에 push하고 master브랜치를 업데이트 시킨 경우, 팀원간의 히스토리는 서로 달라지게 됩니다.

서버에 있는 master브랜치는 팀원이 push를 했기 때문에 가리키는 커밋이 달라졌지만, 로컬의 내 컴퓨터는 업데이트 되지않아 origin/master포인터는 그대로입니다.

저장소 정보 동기화하기

리모트 서버로부터 저장소 정보를 동기화하려면 git fetch [remote] 명령을 사용합니다. remote 주소가 origin으로 되어있다면 git fetch origin이 됩니다. 현재 로컬의 저장소가 갖지 않은 새로운 정보가 있으면 모두 내려받고, 받은 데이터를 로컬 저장소에 업데이트하고 나서 origin/master 포인터 위치를 최신 커밋으로 이동시킵니다. 워킹 디렉토리가 변경되는 것은 아닙니다.

또 다른 저장소가 있는 경우

리모트 저장소를 여러 개 운영하는 상황을 가정하고 Git 저장소를 팀 내부에 하나 추가해보겠습니다. 이 저장소의 주소가 git.team1.ourcompany.com 이며 Git의 기초에서 살펴본 git remote add 명령으로 현재 작업중인 프로젝트에 팀의 저장소를 추가합니다.

추가를 하고나면 git fetch teamone 명령으로 teamone 서버의 데이터를 내려받습니다. 명령을 실행해도 기존의 origin서버의 데이터에 포함되는 데이터라면 아무 것도 내려받지 않습니다.

하지만 이 명령은 리모트 트래킹 브랜치 teamone/master 가 teamone 서버의 master 브랜치가 가리키는 커밋으로 이동합니다.

Push하기

로컬의 브랜치를 서버로 전송하려면 쓰기 권한이 있는 리모트 저장소여야 합니다. 로컬 저장소의 브랜치는 자동으로 리모트 저장소로 전송되지 않습니다. 명시적으로 브랜치를 Push해야 정보가 전송됩니다. 따라서 리모트 저장소에 전송하지 않고 로컬 브랜치에만 두는 비공개 브랜치 를 만들어 볼 수도 있습니다.

serverfix 라는 브랜치를 Push해보겠습니다.

먼저 로컬과 리모트의 브랜치 이름이 같을 때 인 일반적인 경우 입니다.

$ git push origin serverfix
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
* [new branch] serverfix -> serverfix

로컬과 리모트의 이름이 다를 경우

$ git push origin serverfix:awesomebranch

트래킹 브랜치

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

서버로부터 저장소를 Clone하면 Git은 자동으로 master브랜치를 origin/master 브랜치의 트래킹 브랜치로 만듭니다.

트래킹 브랜치를 만드는 방법은 git checkout -b [branch] [remotename]/[branch] 명령어를 사용하면 됩니다.
git checkout --track [remotename]/[branch]를 이용하면 자동으로 로컬브랜치 이름을 설정해줍니다. 예를 들어 git checkout --track origin/serverfix 라고 명령어를 입력한다면 로컬 브랜치 이름은 serverfix로 자동생성됩니다.

이제 트래킹 브랜치에서 git push 또는 git pull할 경우 자동으로 데이터를 보내거나 가져옵니다.
이미 로컬에 존재하는 브랜치가 리모트의 특정 브랜치를 추적하게 하려면 git branch 명령에 -u 옵션 또는 -upstream-to 옵션을 붙여서 설정합니다.

$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
  • Upstream 별명

    추적 브랜치를 설정했다면 추적 브랜치 이름을 @{upstream} 이나 @{u} 로 짧게 대체하여 사용할 수 있습니다. master 브랜치가 origin/master 브랜치를 추적하는 경우라면 git merge origin/master 명령과 git merge @{u} 명령을 똑같이 사용할 수 있습니다.

트래킹 브랜치 설정 확인

추적 브랜치가 현재 어떻게 설정되어 있는지 확인하려면 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

여기서 중요한 점은 명령을 실행했을 때 나타나는 결과는 모두 마지막으로 서버에서 데이터를 가져온(fetch) 시점을 바탕으로 계산한다는 점입니다. 최신의 데이터를 보려면 fetch후에 확인해야 합니다.
또는 아래 처럼 한 번에 명령을 실행시킵니다.

$ git fetch --all; git branch -vv

Pull 하기

git pull 명령은 git fetch 명령을 실행한 뒤 자동으로 git merge를 수행하는 것입니다.
git fetch 명령은 서버에는 존재하지만 로컬에는 없는 데이터를 받아와서 저장합니다. 이 때 워킹 디렉토리의 파일은 변경되지 않는다고 했습니다. 사용자가 Merge를 할 수 있게 준비만 해둡니다.
일반적으로 fetch 와 merge 명령을 명시적으로 사용하는 것이 pull 명령으로 한번에 두 작업을 하는 것보다 낫다고 합니다.

리모트 브랜치 삭제

브랜치를 삭제 하려고 할 때, 예를 들어 master 브랜치로 Merge해서 더 이상 필요하지 않을 경우 삭제할 수 있습니다 git push 명령에 --delete옵션을 더합니다.

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

여기 까지 리모트 브랜치에 대한 포스팅을 마치겠습니다.
감사합니다.

다음 포스팅에서 Rebase에 대해서 다뤄보겠습니다.

좋은 웹페이지 즐겨찾기