개발자의 교양 (2) - 버전 관리와 Git, 그리고 Github

img

버전관리란?

특정 시점의 진행 상황을 저장해두고, 언제 다시 돌아오더라도 그 시점으로부터 다시 시작할 수 있도록 관리하는 것이다. 만약 되돌아가는 기능도 있다면 언제든 원하는 시점으로 돌아갈 수 있다.

Git과 Github

개발을 하면서 코드를 짜다보면 이런 버전 관리가 필수적이다. 이런 소스 코드의 버전 관리를 도와주는 시스템 중 하나가 바로 GitGithub이다. 코드의 버전을 관리함과 동시에 다른 사람과 협업하는 것을 편리하게 만들어주는 프로그램이다.

Git과 Github와 관련해서는 수많은 강좌들이 있다. 개인적으로 나도 이런 강좌들 듣고 끙끙 공부하다가 그냥 아는 사람에게 한번 배웠는데 이 방법이 더 빠르고 쉽게 배울 수 있다. 그래서 가급적이면 깃과 깃허브에 대해 잘 아는 사람에게 배우도록 하는데, 그럴 상황이 여의치가 않는다면 아래 글을 추천한다.

Git? Github? 똑같은거 아닌가요?

엄밀히 말하자면 다르다!

Git

개발을 진행하며 작성하는 소스코드가 업데이트 되는 버전을 기록해두고 관리할 수 있는 소스코드 버전 관리 시스템

Github

Git으로 관리하는 프로젝트를 호스팅하고, 시간과 공간의 제약 없이 협업할 수 있는 온라인 서비스

좀 더 첨언을 하자면,

  • Git이 버전 기록을 저장한다면, Github에서는 그 기록을 다른 사람과 함께 공유하면서 협업할 수 있다.
  • Github는 Git이라는 도구를 더 쉽게 사용하게 해주는 사설 서비스다. Github과 같이 웹사이트 기반으로 Git을 관리하는 온라인 서비스는 Github외에도 Gitlab 등이 있다.

우분투에서 Git 시작하기.

어쩌다보니 나는 지금 우분투를 사용하고 있다.

1. 터미널 시작하기

ctrl + alt + T를 눌러 터미널을 실행시키자.

2. 우분투에 GIT 설치하기

터미널을 켜고, 아래의 명령어로 git설치 여부를 알 수 있다.

1
$ git --version

설치되어있지 않다는 내용이 출력되었다면 제대로 깃을 설치해보도록 하자. 아래의 명령어를 입력해준다.

1
$ sudo apt-get install git

3. 깃허브 회원가입 하기

https://github.com

그 다음에는 바로 깃허브를 사용해보도록 하자.

Github는 위에서 말했듯이 웹사이트 기반 소스코드 버전관리 시스템이기 때문에 해당 사이트의 계정을 만들어야 사용할 수 있다. 기업용으로 사용하는 것이 아니라면 대부분 무료이며, 학생들에게는 github student package를 제공하니 학교 메일을 인증해서 사용하면 좋다.

4. 로컬의 git에서 github 계정 정보 등록하기

먼저 해야할 일은 로컬의 git과 원격에 있는 github를 연결하는 것이다.

이때 로컬의 git과 동기화해서 온라인으로 관리할 수 있는 원격 저장소를 깃허브에서는 레파지토리(repository)라고 부른다.

따라서 우리가 로컬에서 다양한 코드 작업을 한 후에 github의 내 계정에 있는 레포지토리로 잘 전송하려면 로컬의 깃이 원격의 깃허브 계정 정보를 알고있어야 한다.

아래의 명령어로 깃과 깃허브를 연결해보자.

1
2
$ git config --global user.email "ENTER-YOUR-EMAIL"
$ git config --global user.name "ENTER-YOUR-NAME"

위에서 ENTER-YOUR-EMAILENTER-YOUR-NAME에서는 본인의 이메일주소와 username으로 입력하면 된다. 이렇게 입력해주고나면 git툴이 내가 Github 사이트로 코드 정보를 전송할 때 어떤 계정에 있는 레파지토리로 전송해야 하는지 기억한다.

아래와 같이, Git에 등록한 config의 정보를 모두 확인하고 싶으면 아래 명령어를 입력해보자.

1
$ git config -l

5. 내 컴퓨터에 로컬 저장소 만들기

원하는 위치에 동기화를 진행하고 코드를 넣을 폴더를 하나 생성한다.

1
2
$ cd ~
$ mkdir git_test

원하는 폴더를 생성하였다면 그 폴더로 옮겨가 이 디렉토리를 깃으로 관리하자.

1
2
$ cd git_test
$ git init

init은 initialization의 약자로, 이 명령어는 지금부터 git_test 디렉토리에서 발생하는 ㅁ모든 변화를 기록하겠다는 의미다.

6. 로컬 저장소에서 변경사항 커밋하기

이제 해당 디렉토리에서 마구마구 프로젝트를 진행하면 여러가지가 변경된 파일이 많이 생길 것이다.

Git이 추적하고 있는 변화는 아래 명령어로 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
$ git status
On branch master

No commits yet

Untracked files:
    (use "git add <file>..." to include in what will be committed)
    README.md

nothing added to commit but untracked files present (use "git add" to track) 

위와 같은 내용이 출력되었다면 성공이다.

여기서 Untracked files에서 나타나는 내용을 우리가 리포트 할 필요가 있는데, 이는 addcommit명령어를 사용해서 진행할 수 있다.

1
2
3
4
5
$ git add * //모든 파일을 add연산. 개별 파일명을 작성해도 무방하다.
$ git commit -m "Create something new source code"
[master (root-commit) 438a37c] new readme file 
    1 file changed, 1 insertion(+)
    create mode 100644 README.md

-m은 메세지 옵션이다. git commit -m 뒤에는 해당 커밋에 대한 제목을 작성하면 된다.

addcommit의 개념은 Git을 다룰 때 아주 중요한 개념 중 하나다. 두 명령어 모두 현재의 변화를 기록하기 위한 명령어인데 대략적으로 설명하자면

  • add : 변화를 기록하기 위한 준비단계. 파일을 add하는 것을 staging 한다, 또는 stage에 올려둔다는 등의 표현을 사용한다.
  • commit : 특정 순간의 버전을 스냅샷으로 확정시켜 남겨두는 것을 의미한다.

7. Github에 레포지토리를 만들고 로컬 저장소와 연결하기

위에서 만든 깃허브 계정으로 새로운 레포지토리를 만들어 이를 로컬 저장소와 연결시켜보자.

1
$ git remote add origin https://github.com/USERNAME/USER-REPOSITORY-NAME

/USERNAME/USER-REPOSITORY-NAME 부분에는 자신의 username, repository 이름을 입력해주면 된다.

8. 로컬저장소의 내용을 원격 저장소로 push하기

이제 로컬에서 모든 레파지토리 수정이 끝나면, 원격 저장소로 내용을 push한다.

1
2
3
4
5
6
7
$ git push origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 230 bytes | 230.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/jiyeoon/first_test.git
    * [new branch]      master -> master

위 명령어는 현재 로컬에 있는 버전 기록과 모든 파일을 origin, 즉 원격 저장소의 master 브랜치로 push해 밀어 넣겠다는 의미다.

9. 다른 사람이 수정한 코드 불러오기

여기저기서 협업을 하다보면 내 로컬 저장소의 내용과 원격 저장소의 내용이 달라질 경우가 있다. 이때 원격 저장소의 내용을 불러올 때 pull을 사용한다.

1
$ git pull

그 외 각종 git 명령어들

Branch

브랜치는 여러 작업을 독립적으로 진행하려고 할 때 필요하다. 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지않기 때문에 여러 작업을 동시에 진행할 수 있다.

마스터 브랜치를 두고, 다른 기능들을 구현할 때 해당 브랜치들을 따로 만든 다음 나중에 마스터 브랜치와 merge하는 방식을 택하면 깔끔한 버전 관리를 할 수 있다.

img

수많은 깃허브를 통한 협업 방법(?)이 있는데 이는 그 중 하나다. 위는 master 브랜치와 develop 브랜치를 따로 두어 배포용 master 브랜치를 깔끔하게 정리해두고 있다.

브랜치 목록 보기

1
2
$ git branch -r //원격 브랜치 목록 보기
$ git branch -a //로컬 브랜치 목록 보기

브랜치 생성하기

1
$ git branch BRANCH-NAME

브랜치 선택하기

1
$ git checkout BRANCH-NAME

브랜치 삭제하기

1
$ git branch -d BRANCH-NAME

그 외에도 다양한 명령어가 있다. 이는 아래 링크에서 확인하자! https://medium.com/@pks2974/%EC%9E%90%EC%A3%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EA%B8%B0%EC%B4%88-git-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0-533b3689db81