나의 지식 보관소
Git Remote Branches ( 리모트 브랜치 ) 본문
리모트 레퍼런스는 브랜치 태그 등을 포함한 리모트 리포지토리의 레퍼런스(포인터)이다.
$ git ls-remote <remote> 명령을 사용해서 리모트 레퍼런스의 목록을 얻을 수 있다.
$ git remote show <remote> 명령은 리모트 브랜치들의 정보를 얻을 수 있다.
하지만 보통은 remote-tracking branch를 사용한다.
Remote-tracking branch
Remote-tracking branch는 리모트 브랜치들의 상태를 참조하는 브랜치이다. Remote-tracking branch는 움직일 수 없고 Git이 자동으로 움직여준다. 리모트 저장소에 마지막으로 연결했을 때 브랜치가 어떤 커밋을 가리키고 있었는지 나타내는 북마크라고 생각하면 된다.
Remote-tracking branch는 <remote>/<branch>의 이름 형식을 갖는다. 예를 들어 만약 origin의 master 브랜치를 보고 싶다면 origin/master라는 이름으로 브랜치를 확인하면 된다. 만약 어떤 issue를 어떤 파트너와 함께 일하고 있고 그 사람이 iss53 브랜치를 서버로 푸시했고 너도 iss53 브랜치를 로컬에서 가지고 있다면, 이때 서버의 iss53 브랜치가 가리키는 커밋은 로컬에서 origin/iss53이 가리키는 커밋이다.
예를 하나 들어보겠다. 네가 git.ourcompany.com이라는 네트워크에 Git서버를 가지고 있다고 해보자. 만약 네가 여기서 클론 하면, Git은 자동적으로 이것의 이름을 origin이라고 지정한다. 그리고 모든 데이터를 가져온 후에 master 브랜치를 가리키는 포인터를 만들어서 로컬에서 origin/master 라고 이름 붙인다. 그리고 Git은 너의 로컬 master 브랜치가 origin의 master 브랜치와 같은 곳을 가리키도록 하므로 너는 이 브랜치에서 작업을 시작하면 된다.
이후 로컬 저장소에서 어떤 작업을 하고 있는데 다른 팀원이 서버에 Push하고 master 브랜치를 업데이트하게 되면 팀원 간의 히스토리는 서로 달라지게 되고, 로컬 저장소는 서버 저장소로부터 어떤 데이터도 주고받지 않았기 때문에 origin/master 포인터는 그대로이다.
리모트 저장소로부터 정보를 동기화하려면 $ git fetch origin 명령을 사용하면 된다. 명령을 실행하면 현재 로컬 저장소가 갖고 있지 않은 새로운 정보가 있으면 모두 내려받고, 받은 데이터를 로컬 저장소에 업데이트하고 나서, origin/master 포인터의 위치를 최신 커밋으로 이동시킨다.
Push 하기
로컬 저장소의 브랜치는 자동으로 리모트 저장소로 전송되진 않는다. 명시적으로 브랜치를 Push 해야 정보가 전송된다. 따라서 리모트 저장소에 전송하지 않고 로컬 브랜치에만 두는 비공개 블랜치를 만들 수 있다. Push는 다음과 같은 명령으로 할 수 있다. $ git push <remote> <branch> 명령을 사용한다.
나중에 다른 동료가 저장소를 Fetch 하고 나서 서버에 있는 브랜치에 접근할 때 또한 <remote>/<branch> 로 접근한다.
여기서 중요한 것은 Fetch명령으로 리모트 트래킹 브랜치를 내려받는다고 해서 로컬 저장소에 수정할 수 있는 브랜치가 생기는 것이 아니라 수정할 수 없는 <remote>/<branch> 브랜치 포인터가 생기는 것이다. 만일 새로 받은 브랜치의 내용을 Merge 하려면 $ git merge <remote>/<branch> 명령을 사용하면 된다. 만약 merge하지 않고 리모트 트래킹 브랜치에서 시작하는 새 브랜치를 만들려면 $ git checkout -b <branch> <remote>/<branch> 명령을 사용하면 된다. 그러면 <name>라는 <remote>/<branch>에서 시작하고 수정할 수 있는 로컬 브랜치가 만들어진다.
브랜치 추적
리모트 트래킹 브랜치를 로컬 브랜치로 Checkout 하면 자동으로 트래킹 브랜치가 만들어진다( 트래킹 하는 대상 브랜치를 "Upstream 브랜치" 라고 부른다 ). 트래킹 브랜치는 리모트 브랜치와 직접적인 연결고리가 있는 로컬 브랜치이다. 트래킹 브랜치에서 $ git pull 명령을 내리면 리모트 저장소로부터 데이터를 내려받아 연결된 리모트 브랜치와 자동으로 Merge 한다.
트래킹 브랜치를 만드는 방법은 $ git checkout -b <branch> <remote>/<branch> 명령을 사용하면 되고 또 --track 옵션을 사용하여 $ git checkout --track <remote>/<branch> 명령으로 로컬 브랜치 이름을 자동으로 생성할 수도 있다. 또한 $ git checkout <branch> 를 사용하면 입력한 브랜치가 있는 리모트가 딱 하나 있고 로컬에는 없으면 Git은 자동으로 트래킹 브랜치를 만들어준다.
만약 이미 존재하는 브랜치가 리모트의 특정 브랜치를 추적하게 하려면 $ git branch 명령에 -u 나 --set-upstream-to 옵션을 붙여서 $ git branch -u <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
위 예시에서 ahead는 앞선 커밋 개수를 나타내고 behind 는 뒤처진 커밋 개수를 뜻한다. 즉 ahead는 서버로 보내지 않은 커밋 개수를 behind는 로컬 브랜치로 머지하지 않은 커밋 개수를 뜻한다.
그리고 testing 브랜치는 추적하는 브랜치가 없는 상태임을 나타낸다.
단 여기서 제일 중요한 점은 $ git branch -vv 명령을 실행했을 때 나타나는 모든 결과는 모두 마지막으로 서버에서 데이터를 가져온 시점을 바탕으로 계산한다는 것이다. 현재 시점에서 진짜 최신 데이터로 추적 상황을 알아보려면 $ git fetch --all; git branch -vv 명령을 통해 먼저 서버로부터 최신 데이터를 가져온 후에 추적 상황을 확인해야 한다.
Pull 하기
$ git pull 명령은 $ git fetch 명령 이후에 자동으로 $ git merge 를 하는 것과 같다. 바로 앞에서 살펴본 대로 clone 이나 checkout 명령을 실행하여 추적 브랜치가 설정되면 pull 명령은 서버로부터 데이터를 가져와서 현재 로컬 브랜치와 서버의 추적 브랜치를 머지한다.
일반적으로는 fetch와 merge명령을 명시적으로 사용하는 것이 pull명령을 사용하는 것보다 낫다.
리모트 브랜치 삭제
리모트 브랜치가 더 이상 필요하지 않아서 삭제하려면 $ git push --delete <branch> 명령을 사용하여 삭제할 수 있다. 이 명령을 통해 서버에서 브랜치 하나가 삭제된다.
'Git' 카테고리의 다른 글
Git 브랜치 관리 (0) | 2020.04.30 |
---|---|
Git 충돌(conflict) / vscode를 병합(merge)도구로 사용하기 (0) | 2020.04.29 |
3-way merge (0) | 2020.04.27 |
Git Merge(병합) (0) | 2020.04.26 |
Git 브랜치 (0) | 2020.04.26 |