모든 내용은 https://git-scm.com/book를 참고하여 만들었습니다.
브랜치 추적
리모트 트래킹 브랜치를 로컬 브랜치로 Checkout 하면 자동으로 트래킹(Tracking) 브랜치 가 만들어진다. (트래킹 하는 대상 브랜치를 Upstream 브랜치 라고 부른다)
트래킹 브랜치는 리모트 브랜치와 직접적인 연결고리가 있는 로컬 브랜치 이다. 트래킹 브랜치에서 git pull
명령을 내리면 리모트 저장소로부터 데이터를 내려받아 연결된 리모트 브랜치와 자동으로 Merge 한다.
서버로부터 저장소를 Clone을 하면 Git은 자동으로 master
브랜치를 origin/master
브랜치의 트래킹 브랜치로 만든다.
트래킹 브랜치를 직접 만들 수 있는데 리모트를 origin
이 아닌 다른 리모트로 할 수도 있고, 브랜치도 master
가 아닌 다른 브랜치로 추적하게 할 수 있다. git checkout -b [branch] [remotename]/[branch]
명령으로 간단히 트래킹 브랜치를 만들 수 있다. --track
옵션을 사용하여 로컬 브랜치 이름을 자동으로 생성할 수 있다.
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
이 명령은 매우 자주 쓰여서 더 생략할 수 있다. 입력한 브랜치가 있는 (a) 리모트가 딱 하나 있고 (b) 로컬에는 없으면 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'
이제 sf
브랜치에서 Push 나 Pull 하면 자동으로 origin/serverfix
로 데이터를 보내거나 가져온다.
이미 로컬에 존재하는 브랜치가 리모트의 특정 브랜치를 추적하게 하려면 git branch
명령에 -u
나 --set-upstream-to
옵션을 붙여서 아래와 같이 설정한다.
$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Note
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
위의 결과를 보면 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 한다.
일반적으로 fetch
와 merge
명령을 명시적으로 사용하는 것이 pull 명령으로 한번에 두 작업을 하는 것보다 낫다.
리모트 브랜치 삭제
동료와 협업하기 위해 리모트 브랜치를 만들었다가 작업을 마치고 master
브랜치로 Merge 했다. 협업하는 데 사용했던 그 리모트 브랜치는 이제 더 이상 필요하지 않기에 삭제할 수 있다. git push
명령에 --delete
옵션을 사용하여 리모트 브랜치를 삭제할 수 있다. serverfix
라는 리모트 브랜치를 삭제하려면 아래와 같이 실행한다.
$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
- [deleted] serverfix
위 명령을 실행하면 서버에서 브랜치(즉 커밋을 가리키는 포인터) 하나가 사라진다. 서버에서 가비지 컬렉터가 동작하지 않는 한 데이터는 사라지지 않기 때문에 종종 의도치 않게 삭제한 경우에도 커밋한 데이터를 살릴 수 있다.