[2장]리모트 저장소

협업, 공유
인터넷이나 네트워크 어딘가의 저장소

다른 사람들과 함께 일한다는 것은 리모트 저장소를 관리하면서 데이터를 거기에 Push하고 Pull 하는 것이다. 리모트 저장소를 관리한다는 것은 저장소를 추가, 삭제하는 것뿐만 아니라 브랜치를 관리하고 추적할지 말지 등을 관리하는 것을 말한다.

확인하기

git remote - 현재 프로젝트에 등록된 리모트 저장소를 확인가능(저장소의 단축이름 표시)

일전에 Clone했던 simplegit에서 명령어를 실행해보자.

$ git remote
origin

저장소를 Clone 하면 origin이라는 리모트 저장소가 자동으로 등록되기 때문에 origin이라는 이름을 볼 수 있다.

-v 옵션을 이용하면 리모트 저장소의 URL을 볼 수 있다.

$ git remote -v
origin  https://github.com/schacon/simplegit-progit (fetch)
origin  https://github.com/schacon/simplegit-progit (push)

리모트 저장소가 여러 개 있다면 이 명령은 등록된 전부를 보여준다. 여러 사람과 함께 작업하는 리모트 저장소가 여러 개라면 아래와 같은 결과를 얻을 수도 있다.(책에서 복사)

$ git remote -v
bakkdoor https://github.com/bakkdoor/grit (fetch)
bakkdoor https://github.com/bakkdoor/grit (push)
cho45 https://github.com/cho45/grit (fetch)
cho45 https://github.com/cho45/grit (push)
defunkt https://github.com/defunkt/grit (fetch)
defunkt https://github.com/defunkt/grit (push)
koke git://github.com/koke/grit.git (fetch)
koke git://github.com/koke/grit.git (push)
origin git@github.com:mojombo/grit.git (fetch)
origin git@github.com:mojombo/grit.git (push)

이렇게 리모트 저장소가 여러 개 등록되어 있으면 다른 사람이 기여한 내용(Contributions)을 쉽게 가져올 수 있다. 어떤 저장소에는 Push 권한까지 제공하기도 하지만 일단 이 화면에서 Push 가능 권한까지는 확인할 수 없다.

추가하기

git remote add [단축이름] [URL] 형식으로 저장소를 추가할 수 있다.

$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin  https://github.com/schacon/simplegit-progit (fetch)
origin  https://github.com/schacon/simplegit-progit (push)
pb      https://github.com/paulboone/ticgit (fetch)
pb      https://github.com/paulboone/ticgit (push)

이렇게 단축 이름을 등록해두면 URL 대신 단축 이름을 사용할 수 있게된다.

예를 들어 로컬 저장소에는 없지만 Paul의 저장소에 있는 것을 가져오려면 아래처럼 실행하면 된다.

$ git fetch pb
warning: no common commits
remote: Enumerating objects: 634, done.
remote: Total 634 (delta 0), reused 0 (delta 0), pack-reused 634
Receiving objects: 100% (634/634), 88.93 KiB | 254.00 KiB/s, done.
Resolving deltas: 100% (261/261), done.
From https://github.com/paulboone/ticgit
 * [new branch]      master     -> pb/master
 * [new branch]      ticgit     -> pb/ticgit

로컬에서 pb/master 가 Paul의 master브랜치이다. 이 브랜치를 로컬 브랜치중 하나에 Merge 하거나 Checkout 해서 브랜치 내용을 자세히 확인할 수 있다. (브랜치 사용법은 나중에 또 공부하자.)

Pull 하거나 Fetch 하기

Fetch

로컬에는 없지만, 리모트 저장소에는 있는 데이터를 모두 가져오는 것. 리모트 저장소의 모든 브랜치를 로컬에서 접근할 수 있어서 언제든지 Merge 하거나 내용을 살펴볼 수 있다.

저장소를 Clone하면 명령은 자동으로 리모트 저장소를 origin 이라는 이름으로 추가한다. 그래서 나중에 git fetch origin 명령을 실행하면 Clone한 이후에(혹은 마지막으로 가져온 이후에) 수정된 것을 모두 가져온다. git fetch 명령은 리모트 저장소의 데이터를 모두 로컬로 가져오지만, 자동으로 Merge 하지는 않는다. 그래서 로컬에서 하던 작업을 정리하고 나서 수동으로 Merge해야 한다.

Pull

리모트 저장소 브랜치에서 데이터를 가져올 뿐만 아니라 자동으로 로컬 브랜치와 Merge 시킬 수 있는 명령어.(브랜치 사용법에서 다시 자세히 나옴)

리모트 저장소에 master 브랜치가 있다는 가정하에 git clone 명령을 실행하면 자동으로 로컬의 master브랜치가 리모트 저장소의 master브랜치를 추적한다. 그리고 git pull 명령은 Clone 한 서버에서 데이터를 가져오고 그 데이터를 자동으로 현재 작업하는 코드와 Merge 시킨다.

요약

즉 fetch와 pull 은 Merge 여부만 다르고 같다. fetch는 가져만 오고, pull은 Merge까지 실행한다. 필요에 따라 잘 사용할 것

Push 하기

git push origin masterr

프로젝트를 공유하고 싶을 때 Upstream 저장소에 Push할 수 있다. 이 명령은 git push [리모트 저장소 이름] [브랜치 이름] 으로 실행한다. (마스터 브랜치를 리모트 저장소의 origin 서버에 push한다는 뜻)

이 명령은 Clone한 리모트 저장소에 쓰기 권한이 있고, Clone하고 난 이후 아무도 Upstream 저장소에 Push 하지 않았을 때만 사용할 수 있다. 다시 말해서 Clone 한 사람이 여러 명 있을 때, 다른 사람이 Push 한 후 내가 Push 하려고하면 Push 할 수가 없다. 먼저 다른 사람이 작업한 것을 가져와(fetch 또는 pull) Merge 한 후에 Push 할 수 있는 것이다. (나중에 브랜치 편에서 다시 공부)

살펴보기

git remote show [리모트 저장소 이름] 명령으로 리모트 저장소의 정보를 확인 가능

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/simplegit-progit
  Push  URL: https://github.com/schacon/simplegit-progit
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

리모트 저장소의 URL과 추적하는 브랜치를 출력한다. 이 명령은 git pull 명령을 실행할 때 master 브랜치와 Merge할 브랜치가 무엇인지 보여 준다. git pull 명령은 리모트 저장소 브랜치의 데이터를 모두 가져오고 나서 자동으로 Merge 할 것이다. 그리고 가져온 모든 리모트 저장소 정보도 출력한다.

브랜치명을 생략하고 git push 명령을 실행할 때 어떤 브랜치가 어떤 브랜치로 Push 되는지 보여준다. 또 아직 로컬로 가져오지 않은 리모트 저장소의 브랜치는 어떤 것들이 있는지, 서버에서는 삭제됐지만 아직 가지고 있는 브랜치는 어떤것인지, git pull 명령을 실행했을 때 자동으로 Merge 할 브랜치는 어떤 것이 있는지 보여준다.

이름을 바꾸거나 삭제하기

이름 바꾸기(rename)

# git remote rename [원래 이름] [바꿀 이름]
$ git remote rename pb paul

$ git remote
origin
paul

이름을 바꾸면 로컬에서 관리하던 리모트 저장소의 브랜치 이름도 변경이 된다. 위의 예처럼 기존에 pb/master 로 사용하던 브랜치는 paul/master 라고 사용해야 한다.

삭제하기(remove 또는 rm)

# git remote remove [삭제할 이름] 또는 git remote rm [삭제할 이름]
$ git remote remove paul

$ git remote
origin

+ Recent posts