본문 바로가기
Book Study/Pro Git

[Pro Git] ch02 - Git의 기초 2 (리모트 저장소, Git Alias)

by 랩린안 2022. 10. 1.

출처 : Pro Git

- 저자 : Scott Chacon, Ben Straub

 

 

리모트 저장소

리모트 저장소를 관리할 줄 알아야 다른 사람과 함께 일할 수 있다. 리모트 저 장소는 인터넷이나 네트워크 어딘가에 있는 저장소를 말한다. 저장소는 여러 개가 있을 수 있는데 어떤 저장소는 읽고 쓰기 모두 할 수 있고 어떤 저장소는 읽기만 가능할 수 있다. 간단히 말해서 다른 사람들과 함께 일한다는 것은 리 모트 저장소를 관리하면서 데이터를 거기에 Push 하고 Pull 하는 것이다. 리모 트 저장소를 관리한다는 것은 저장소를 추가, 삭제하는 것뿐만 아니라 브랜치 를 관리하고 추적할지 말지 등을 관리하는 것을 말한다. 이번에는 리모트 저장소를 관리하는 방법에 대해 설명한다.

 

리모트 저장소 확인하기

git remote 명령으로 현재 프로젝트에 등록된 리모트 저장소를 확인할 수 있다. 이 명령은 리모트 저장소의 단축 이름을 보여준다. 저장소를 Clone 하면 origin이라는 리모트 저장소가 자동으로 등록되기 때문에 origin이라는 이름 을 볼 수 있다.

 

$ git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin

-v옵션을 주어 단축이름과 URL을 함께 볼 수 있다.

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

리모트 저장소가 여러 개 있다면 이 명령은 등록된 전부를 보여준다. 프로 젝트를 여러 사람과 함께 작업하여 등록시킨 리모트 저장소가 여러개라면 아래와 같은 결과를 얻을 수도 있다.

 

$ cd grit
$ 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 설치하기” 에서 자세히 살펴보기로 한다.

 

리모트 저장소 추가하기

새 리모트 저장소를 쉽게 추가할 수 있는데 git remote add [단축이름] [url] 명령을 실행한다.

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

이제 URL 대신에 pb 라는 이름을 사용할 수 있다. 예를 들어 로컬 저장소에 는 없지만 Paul의 저장소에 있는 것을 가져오려면 아래과 같이 실행한다.

 

$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), 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 하기

리모트 저장소에서 데이터를 가져오려면 간단히 아래와 같이 실행한다.

git fetch [remote-name]

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

저장소를 Clone 하면 명령은 자동으로 리모트 저장소를 “origin”이라는 이 름으로 추가한다.

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

 

그냥 쉽게 git pull 명령으로 리모트 저장소 브랜치에서 데이터를 가져 올 뿐만 아니라 자동으로 로컬 브랜치와 Merge 시킬 수 있다.

 

먼저 git clone 명령은 자동으로 로컬의 master 브랜치가 리모트 저장소의 master 브랜치를 추적하도록 한다(물 론 리모트 저장소에 master 브랜치가 있다는 가정에서).

그리고 git pull 명 령은 Clone 한 서버에서 데이터를 가져오고 그 데이터를 자동으로 현재 작업 하는 코드와 Merge 시킨다

 

.

리모트 저장소에 Push 하기

프로젝트를 공유하고 싶을 때 Upstream 저장소에 Push 할 수 있다. 이 명령은 git push [리모트 저장소 이름] [브랜치 이름]으로 단순하다. master 브랜치를 origin 서버에 Push 하려면(다시 말하지만 Clone 하면 보통 자동으 로 origin 이름이 생성된다) 아래와 같이 서버에 Push 한다.

 

 

git push origin master

 

이 명령은 Clone 한 리모트 저장소에 쓰기 권한이 있고, Clone 하고 난 이후 아무도 Upstream 저장소에 Push 하지 않았을 때만 사용할 수 있다. 다시 말해 서 Clone 한 사람이 여러 명 있을 때, 다른 사람이 Push 한 후에 Push 하려고 하 면 Push 할 수 없다. 먼저 다른 사람이 작업한 것을 가져와서 Merge 한 후에 Push 할 수 있다. 

 

리모트 저장소 살펴보기

git remote show [리모트 저장소 이름] 명령으로 리모트 저장소의 구체 적인 정보를 확인할 수 있다. origin 같은 단축이름으로 이 명령을 실행하면 아래와 같은 정보를 볼 수 있다.

 

$ git remote show origin
* remote origin
 Fetch URL: https://github.com/schacon/ticgit
 Push URL: https://github.com/schacon/ticgit
 HEAD branch: master
 Remote branches:
 master tracked
 dev-branch 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을 열심히 사용하게 되면 git remote show 명령은 더 많은 정보 를 보여줄 것이다. 여러분도 언젠가는 아래와 같은 메시지(역주 - 다수의 브랜 치를 사용하는 메시지)를 볼 날이 올 것이다.

 

$ git remote show origin
* remote origin
 URL: https://github.com/my-org/complex-project
 Fetch URL: https://github.com/my-org/complex-project
 Push URL: https://github.com/my-org/complex-project
 HEAD branch: master
 Remote branches:
 master tracked
 dev-branch tracked
 markdown-strip tracked
 issue-43 new (next fetch will store in remotes/origin)
 issue-45 new (next fetch will store in remotes/origin)
 refs/remotes/origin/issue-11 stale (use 'git remote prune' to remove)
 Local branches configured for 'git pull':
 dev-branch merges with remote dev-branch
 master merges with remote master
 Local refs configured for 'git push':
 dev-branch pushes to dev-branch (up to date)
 markdown-strip pushes to markdown-strip (up to date)
 master pushes to master (up to date)

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

 

리모트 저장소 이름을 바꾸거나 리모트 저장소를 삭제하기

 

git remote rename 명령으로 리모트 저장소의 이름을 변경할 수 있다. 예를 들어 pb를 paul로 변경하려면 git remote rename 명령을 사용한다.

$ git remote rename pb paul
$ git remote
origin
paul

리모트 저장소의 브랜치 이름도 바뀐다. 여태까지 pb/master로 리모트 저 장소 브랜치를 사용했으면 이제는 paul/master라고 사용해야 한다. 리모트 저장소를 삭제해야 한다면 git remote rm 명령을 사용한다. 서버 정보가 바뀌었을 때, 더는 별도의 미러가 필요하지 않을 때, 더는 기여자가 활 동하지 않을 때 필요하다.

$ git remote rm paul
$ git remote
origin

Git Alias

명령을 완벽하게 입력하지 않으면 Git은 알아듣지 못한다. Git의 명령을 전 부 입력하는 것이 귀찮다면 git config를 사용하여 각 명령의 Alias을 쉽게 만들 수 있다. 아래는 Alias을 만드는 예이다.

 

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status

 

이제 git commit 대신 git ci만으로도 커밋할 수 있다. Git을 계속 사용한 다면 다른 명령어도 자주 사용하게 될 것이다. 주저말고 자주 사용하는 명령 은 Alias을 만들어 편하게 사용하시길 바란다. 이미 있는 명령을 편리하고 새로운 명령으로 만들어 사용할 수 있다. 예를 들어 파일을 Unstated 상태로 변경하는 명령을 만들어서 불편함을 덜 수 있다. 아래와 같이 unstage 라는 Alias을 만든다

 

$ git config --global alias.unstage 'reset HEAD --'

아래 두 명령은 동일한 명령이다.

 

$ git unstage fileA
$ git reset HEAD fileA

저장소를 만들고 Clone 하는 방법, 수정하고 나서 Stage 하고 커밋하는 방법, 저장소의 히스토리를 조회하는 방법 등을 살펴보았다.