본문 바로가기
프로그래밍/git

[git] git을 이용한 버전관리 - 기본편 (remote, push, pull, fetch, clone) with github

by 사바라다 2020. 4. 18.

안녕하세요. git에 대해서 이야기하는 3번째 시간입니다. 오늘은 원격 저장소(remote repository)과 이를 이용하는 명령어인 push, pull, fetch, clone에 대해서 알아보도록 하겠습니다.

git의 component 구조

이전 시간까지는 혼자서 작업하는 내용의 버전을 관리하는 방법이 었다면 이번시간부터 배우는 원격저장소를 이용하면 공동으로 협업할 수 있는 시스템 아키텍처가 그려지게됩니다. 원격저장소를 포함하면 2가지의 관점에서 구조적인 이미지를 그려볼 수 있습니다. 첫번째는 개인 관점에서의 git 이용 flow, 또 다른 한 관점은 다른 사람과의 공동으로 원격저장소의 사용입니다.

첫번째 git에 관한 포스팅에서 git의 3가지 컴포넌트에 대해서 이야기 했던 적이있습니다. 아래 이미지와 함께 말이죠.

사실 이 이미지에서 저장소(Repository)는 개인 저장소(Local Repository)와 원격 저장소(remote repository)로 나눌 수 있습니다. 그렇게 나누어진 이미지는 아래와 같습니다. (화살표에 표기된 단어는 해당 컴포넌트로 이동하기 위한 명령어입니다.)

개인 저장소에 commit된 버전을 원격저장소로 push 명령어를 통해 넘길 수 있습니다. 그리고 fetch / clone / pull 명령어를 통해 가져올 수도 있습니다.

원격 저장소는 개인이 사용하는 용도라기 보다는 많은 사람들이 공유하는 저장소로 사용되는 경우가 많습니다. 원격저장소를 통해 협업하며 함께 개발해 나가는 것입니다. 이러한 협업은 원격저장소를 통해 하게 되는데 이러한 협업은 아래 그림과 같이 하게 됩니다.

이런식으로 원격 저장소에 있는 파일을 Local에 가져와서 수정이나 추가 후 다시 원격 저장소로 올려둡니다. 내 동료도 동일한 작업을 진행합니다. 이런식으로 협업하여 생산성을 높이는 것입니다. 물론, 만약 같은 파일을 수정하거나 하면 충돌(conflict)가 발생하기도 합니다. 이럴때 해결하는 전략등도 git은 제공해주고 있습니다.

원격 저장소로는 github, gitlab, bitbucket 등이 대표적으로 그 밖에도 많이 존재합니다. 이번시간에 저는 github를 통해서 진행하도록 하겠습니다.

원격 저장소 생성 (github)

github에 먼저 원격 저장소를 생성해보도록 하겠습니다. github 사이트(http://github.com)에 접속하시면, 아래와 같은 페이지가 출력될 것입니다. 만약 처음으로 회원가입을 원하면 sign up을 로그인을 원하시면 sign in을 클릭해서 진행합니다.

github-main page

로그인 후 좌상단의 프로필을 누르고 Your Repository를 클릭합니다.

github-profile

그리고 아래와 new 버튼을 클릭합니다. 이렇게 하면 원격 저장소를 생성하기 위한 정보를 입력하게 됩니다.

github-repository

아래는 원격 저장소를 제작하기 위한 정보를 입력하는 페이지입니다.

github-repository-create

각각의 내용은 아래와 같습니다.

  • Repository name - 원격 저장소 이름 ( 필수 )
  • Description - 원격 저장소 설명
  • Public / Private - 원격 저장소 공개여부 (Public : 공개저장소, Private : 개인저장소)
  • Initilaize this repository with a README : README를 기본적으로 생성할것인지 여부
  • .gitignore : 원격 저장소에 올리지 않을 파일 설정 파일
  • license : 소스가 가지게 되는 라이센스 정보

정보를 기입한 후(Repository name만 필수) Create Repository 버튼을 클릭하면 원격 저장소가 생성됩니다. 이제 우리가 만든 로컬 저장소와 원격저장소를 한번 연동해보도록 하겠습니다.

사용자 인증정보 설정

로컬 저장소에서 원격 저장소로 데이터를 넘길때 커밋한 사람이 누구며, 어떠한 사람인지 남길 필요가 있습니다. 이런 인증에 대한 부분을 git config 명령어로 설정할 수 있습니다. 아래의 명령어는 PC의 git 시스템 환경설정정보를 설정하는 명령어입니다. user.name은 시스템의 이름을, user.email은 email을 나타냅니다. 이 정보들은 commit 할때마다 이 정보를 사용합니다.

$ g it config --global user.name "John Doe"
$ git config --global user.email sabarada@naver.com

remote

remote 명령어는 현재 프로젝트에 등록된 원격 저장소와 관련된 명령어입니다. 우리가 생성한 github와 연동하기 위해서는 먼저 해당 원격 저장소를 프로젝트에 등록시켜야합니다. 연동시키는 명령어는 git remote add <등록 이름> <원격 저장소 주소>입니다. 등록 이름은 등록하고자 하는 이름으로 사용자가 지정할 수 있습니다. 그리고 원격 저장소 주소는 이전에 생성한 github의 주소를 말합니다. 해당주소는 github의 경우 만든 저장소에 아래 처럼 나와있습니다.

github-remote-repository-address

실제 명령어를 사용하면 아래와 같습니다.

$ git remote add origin https://github.com/KoangHoYeom/remote-repository-sample.git

이렇게 명령어를 사용하면 내PC의 로컬 git 프로젝트와 원격 저장소가 연동됩니다. 잘 연동되고 있는지는 git remote 명령어를 통해 알 수 있으며 좀 더 자세한 정보를 원한다면 git remote -v 명령어를 통해 확인할 수 있습니다. 해당 명령어를 입력하면 아래와 같이 프로젝트와 연관된 원격지 주소가 출력되게 됩니다.

git remote -v 명령어

push

push명령어는 현재 프로젝트의 커밋된(HEAD) 내용을 원격 저장소로 내보내는 명령어입니다. push로 내보내게 되면 원격 저장소에 저장되게 되며 이렇게 원격 저장소에 저장된 내용은 다른 사용자들도 이용할 수 있게 됩니다. 명령어는 git push <원격 저장소 명> <branch 이름>를 이용하면 됩니다.

push를 이용하기 위해서는 원격 저장소에 인증이 되어있어야 합니다. 따라서 처음 push를 진행할때는 해당 원격 저장소에 인증하는 과정이 있을 수 있습니다. 아래 명령어로 push를 진행해 보겠습니다.

$ git push origin master

git push error

위와 같이 error: src refspec master does not match any라는 메시지와 함께 정상적으로 되지 않으실겁니다. 이 에러는 아직 로컬에 commit된 내용이 없을 때 출력되는 에러입니다. 파일을 하나 생성후 addcommit명령어로 커밋을 진행한 후 다시 push하면 아래와 같이 로그인을 하라고 출력될 것이미 정확한 인증정보(Username & Password)를 입력하면 push가 정상적으로 이루어 집니다.

git-push-success

이렇게 정상적으로 push가 이루어지면 원격 저장소에 가서 정상적으로 들어갔는지 확인해 보도록 합시다.

git-push-remote

정상적으로 들어간 것을 확인할 수 있었습니다.

pull & fetch

원격 저장소에서 로컬 저장소로 소스를 가져오는 명령어로는 pullfetch가 있습니다. fetch와 pull의 차이는 가져온 소소를 merge 하느냐 안하느냐의 차이가 있습니다. pull 명령어는 원격 저장소의 소스를 가져오고 해당 소스가 현재 내 소스보다 더 최신 버전이라고 하면 지금의 버전을 해당 소스에 맞춰 올립니다. merge 명령어를 사용하는 것이지요. 하지만 fetch의 경우 단지 소스를 가져올 뿐 merge 하지는 않습니다.

다른 프로젝트에서 해당 파일을 업데이트 후 git으로 push하였습니다. 이제 fetch명령어를 통해 변경된 내용을 가져와 보도록 하겠습니다. git fetch <remote> 명령어 입니다.

git fetch origin

제대로 가져왔는지 확인을 위해 git log 명령어으로 확인해보겠습니다. 우리는 아래 며령어로 HEAD와 origin/master가 가리키고 있는 위치가 다른것을 확인할 수 있습니다.

git log --decorate --all --oneline

git log with fetch

그리고 git diff 명령어를 통해 어디가 변경되었는지도 알 수 있습니다.

git diff HEAD origin/master

git diff

pull 명령어는 원격저장소에서 fetch명령어로 가져온 후 merge까지 한번에 해 실제 파일의 내용이 변경되는 명령어입니다. 명령어는 git pull <원격 저장소 명> <branch 명>입니다.

git pull origin master

git pull

fast-forward 업데이트를 진행한다고 로그에 출력된 걸 볼 수 있습니다. 그렇다면 로그를 한번 보도록 하겠습니다.

git log --decorate --all --oneline

git log with git pull

HEAD와 origin/master가 동일한 위치를 가리키고 있는 것을 확인할 수 있습니다. 파일 역시 최신으로 업데이트 된 것을 확인할 수 있습니다.

clone

clone은 git clone <리모트 저장소 주소>를 이용하여 사용할 수 있습니다. 이 명령어는 원격 저장소에 있는 프로젝트를 가져오는 역할을 합니다. master 브런치를 자동으로 가져오며 origin으로 remote도 add해 줍니다. git init 명령어로 git 프로젝트가 아닌 곳에서도 사용할 수 있는 명령어입니다.

git clone https://github.com/KoangHoYeom/remote-repository-sample.git

위 명령어를 실행하면 원격 저장소를 가져옵니다. 해당 디렉토리에 들어가면 이미 git 프로젝트로 init이 되어있으며 remote 등록도 자동으로 되어있음을 알 수 있습니다.

마무리

오늘은 이렇게 원격 저장소를 이용하는 방법과 명령어에 대해서 알아보았습니다. git의 다양한 명령어를 자유롭게 사용할 수 있게되고 흐름을 잘 이해할 수 있게 되시길 바랍니다.

글이 도움이 되셨다면 하트와 광고 클릭 부탁드립니다. :)

감사합니다.

참조

git-scm

댓글