반응형

리모트 Refs는 리모트 저장소에 있는 포인터인 레퍼런스입니다.
리모트 저장소에 있는 브랜치, 태그 등을 의미합니다.

 

1. 리모트 브랜치

리모트 트래킹 브랜치는 리모트 브랜치를 추적하는 레퍼런스이며 브랜치입니다.

 

예를 들어, 리모트 저장소 originmaster 브랜치를 보고 싶다면 origin/master 라는 이름으로 브랜치를 확인하면 됩니다. 다른 팀원과 함께 어떤 이슈를 구현할 때 팀원이 iss53 브랜치를 서버로 PUSH 했고 당신도 로컬에 iss53 브랜치가 있다고 가정해보겠습니다. 이때 서버의 iss53 브랜치가 가리키는 커밋은 로컬에서 origin/iss53 이 가리키는 커밋입니다.

헷갈릴 수 있으니 예제를 좀 더 자세히 살펴보겠습니다.

 

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

그림 1. clone 이후 서버와 로컬의  master  브랜치

 

로컬 저장소에서 어떤 작업을 하고 있는데 동시에 다른 팀원이 git.ourcompany.com 서버에 Push 하고 master 브랜치를 업데이트 했습니다. 그러면 이제 팀원 간의 히스토리는 서로 달라집니다. 서버 저장소로부터 어떤 데이터도 주고받지 않아서 origin/master 포인터는 그대로입니다.

 

그림 2. 로컬과 서버의 독립적인 커밋 히스토리

 

리모트 서버로부터 저장소 정보를 동기화하려면 git fetch origin 명령을 사용합니다.

명령을 실행하면 우선 origin 서버의 주소 정보를 찾아서, 현재 로컬의 저장소가 갖고 있지 않은 새로운 정보가 있으면 모두 내려받고, 받은 데이터를 로컬 저장소에 업데이트하고 나서, origin/master 포인터의 위치를 최신 커밋으로 이동시킵니다.

그림 3.  git fetch  명령은 리모트 브랜치 정보를 업데이트

 

리모트 저장소를 여러 개 운영하는 상황을 이해할 수 있도록 개발용으로 사용할 Git 저장소를 팀 내부에 하나 추가해보겠습니다. 이 저장소의 주소가 git.team1.ourcompany.com 이며 git remote add 명령으로 현재 작업 중인 프로젝트에 팀의 저장소를 추가합니다. 이름을 teamone 으로 짓고 긴 서버 주소 대신 사용합니다.

그림 4.  teamone  이라는 리모트 저장소 추가

 

서버를 추가하고 나면 git fetch teamone 명령으로 teamone 서버의 데이터를 내려받습니다. 명령을 실행해도 teamone 서버의 데이터는 모두 origin 서버에도 있는 것들이라서 아무것도 내려받지 않습니다. 하지만, 이 명령은 리모트 트래킹 브랜치 teamone/masterteamone 서버의 master 브랜치가 가리키는 커밋을 가리키게 합니다.

그림 5.  teamone/master  의 리모트 트래킹 브랜치

 

리모트 브랜치 삭제

동료와 협업하기 위해 리모트 브랜치를 만들었다가 작업을 마치고 master 브랜치로 Merge 했다면 협업하는 데 사용했던 그 리모트 브랜치는 이제 더 이상 필요하지 않기에 삭제할 수 있습니다. git push 명령에 --delete 옵션을 사용하여 리모트 브랜치를 삭제할 수 있습니다. serverfix 라는 리모트 브랜치를 삭제하려면 아래와 같이 실행합니다.

$ git push origin --delete serverfix

위 명령을 실행하면 서버에서 브랜치 하나가 사라집니다. 종종 의도치 않게 삭제한 경우에도 서버에서 가비지 컬렉터가 동작하지 않는 한 커밋한 데이터를 살릴 수 있습니다.

 

2. Push 하기

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

 

serverfix 라는 브랜치를 다른 사람과 공유할 때도 브랜치를 처음 Push 하는 것과 같은 방법으로 Push 합니다. 아래와 같이 git push <remote> <branch> 명령을 사용합니다.

$ 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은 serverfix 라는 브랜치 이름을 refs/heads/serverfix:refs/heads/serverfix 로 확장합니다. 이것은 serverfix 라는 로컬 브랜치를 서버로 Push 하는데 리모트의 serverfix 브랜치로 업데이트 한다는 것을 의미합니다.

 

git push origin serverfix:serverfix 라고 Push 하는 것도 같은 의미인데 이것은 "로컬의 serverfix 브랜치를 리모트 저장소의 serverfix 브랜치로 Push 하라" 라는 뜻입니다. 로컬 브랜치의 이름과 리모트 서버의 브랜치 이름이 다를 때 필요합니다. 정리하자면, 로컬 브랜치와 Push 하고자 하는 리모트 서버 브랜치의 이름이 다를 때는 git push <remote> <local branch>:<remote branch> 명령어를 사용하면 되겠습니다.

 

3. Pull 하기

git fetch 명령을 실행하면 서버에는 존재하지만, 로컬에는 아직 없는 데이터를 받아와서 저장합니다. 이때 워킹 디렉토리의 파일 내용은 변경되지 않고 그대로 남습니다. 서버로부터 데이터를 가져와서 저장해두고 사용자가 Merge 하도록 준비만 해둡니다.

 

간단히 말하면 git pull 명령은 대부분 git fetch 명령을 실행하고 나서 자동으로 git merge 명령을 수행하는 것 뿐입니다. clone 이나 checkout 명령을 실행하여 추적 브랜치가 설정되면 git pull 명령은 서버로부터 데이터를 가져와서 현재 로컬 브랜치와 서버의 추적 브랜치를 Merge 합니다.

 

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

 

4. 브랜치 추적(Upstream Branch)

리모트 트래킹 브랜치를 로컬 브랜치로 checkout 하면 자동으로 "트래킹 브랜치" 가 만들어집니다.
(트래킹 하는 대상 브랜치를 "Upstream 브랜치" 라고 부릅니다.)

 

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

 

서버로부터 저장소를 clone 하면 Git은 자동으로 master 브랜치를 origin/master 브랜치의 트래킹 브랜치로 만듭니다. 트래킹 브랜치를 직접 만들 수 있는데 리모트를 origin 이 아닌 다른 리모트로 할 수도 있고, 브랜치도 master 가 아닌 다른 브랜치로 추적하게 할 수 있습니다.

 

git checkout -b <branch> <remote>/<branch> 명령으로 간단히 트래킹 브랜치를 만들 수 있고,
--track 옵션을 사용하여 로컬 브랜치 이름을 자동으로 생성할 수 있습니다.

$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'

이제 sf 브랜치에서 Push 나 Pull 하면 자동으로 origin/serverfix 로 데이터를 보내거나 가져옵니다.

이미 로컬에 존재하는 브랜치가 리모트의 특정 브랜치를 추적하게 하려면 git branch 명령에 -u 옵션을 붙여 설정해줍니다.

$ git branch -u origin/serverfix
Branch sf set up to track remote branch serverfix from origin.

출처 - 저서 ProGit

반응형
반응형