Git remote

$ git remote add origin git-url 을 통해서 로컬 브랜치와 리모트 브랜치를 연결했다. 리모트 저장소는 여러개 있을수 있으므로 $ git remote add qa git-url 을 통해서 여러 리모트 저장소를 연결 할수 있다. $git remote -v 명령어를 실행하면 연결된 리모트 브랜치를 확인할수 있다.

Git Refspec

$ cat .git/config 을 실행 하면 아래와 같은 내용을 확인할수 있다.

 1 [core]
 2   repositoryformatversion = 0
 3   filemode = true
 4   bare = false
 5   logallrefupdates = true
 6   ignorecase = true
 7   precomposeunicode = false
 8 [remote "origin"]
 9   url = git@github.com:NextersAppFactory/Vobble.API.git
10   fetch = +refs/heads/*:refs/remotes/origin/*
11 [branch "master"]
12   remote = origin
13   merge = refs/heads/master
14 [branch "jytest"]
15   remote = origin
16   merge = refs/heads/jytest
17 [merge]
18   tool = vimdiff
19 [remote "qa"]
20   url = git@github.com:rangken/gittest.git
21   fetch = +refs/heads/*:refs/remotes/qa/*

git config 로 설정한 내용과 위에서 추가한 리모트 저장소의 내용을 볼수있다. 브랜치는 master 와 jytest 두개를 만었고 리모트 저장소는 origin 과 qa를 만들었다. 각 Refspec 을 자세히 보면

+refs/heads/*:refs/remotes/origin/*

+<src>:<dest> 형식으로 되어있다. <src>은 로컬 저장소의 레퍼런스고 <dst> 는 매핑되는 리모트 저장소의 래퍼런스이다. + 가 없으면 Fast_forward 가 아니라도 업데이트 된다.

1 $ git log origin/master
2 $ git log remotes/origin/master
3 $ git log refs/remotes/origin/master

위 세개의 명령은 모두 리모트 저장소에 있는 master 브랜치에 로그를 출력하라는 의미이다. git log master 는 로컬 저장소에 master 브랜치의 로그를 출력한다. git log refs/heads/master 와 같은 의미이다.

만약에 fetch 부분을 +refs/heads/master:refs/remotes/origin/master 로 변경하면 master 브랜치에서만 가져올수 있고 jytest 브랜치에서는 정보를 가져올수 없도록 만들수 있다. 즉 * wildcard 의 뜻은 어떤 브랜치이든 위에 url 과 연결 하라는 뜻이다. $ git fetch origin master:refs/remotes/origin/master 명령 처럼 명시적으로 브랜치를 지정해 줄 수 도 있다. 로컬 브랜치 master 로 리모트 브랜치 origin/master 의 정보를 가져오라는 뜻이된다.

1 [remote "origin"]
2   url = git@github.com:NextersAppFactory/Vobble.API.git
3   fetch = +refs/heads/*:refs/remotes/origin/*
4   fetch = +refs/heads/*:refs/remotes/qa/*

위 처럼 두개의 fetch 저장소를 사용해도 된다.

Refspec Push

$ git push origin master:refs/heads/qa/master 를 실행하면 현재 master 브랜치를 리모트의 qa/master 브랜치로 Push 할 수가 있다. 매번 지정해 주기 귀찮을 경우

1 [remote "origin"]
2   url = git@github.com:NextersAppFactory/Vobble.API.git
3   fetch = +refs/heads/*:refs/remotes/origin/*
4   push = refs/heads/master:refs/heads/qa/master

해주면 git push origin을 실행 하면 알아서 로컬 ref/heads/master 에서 리모트 refs/heads/qa/master 푸시를 하게된다.

래퍼런스 삭제하기

Refspec 으로 서버에 있는 래퍼런스를 삭제할수 있다.

$ git push origin :topic Refspec 의 형식은 <src>:<dst> 이고 <src> 를 비우고 실행하면 <dst> 를 비우라는 명령이 되고 <dst> 는 삭제된다.

Reference

Git-scm