사내에서 SVN으로 소스 버전관리를 하고 있어 GIT은 거의 사용하지 않았으나, Python 공부하면서 만들어본 Toy Project 소스를 관리하기 위해 GitHub 계정을 생성하였다.
GIT과 SVN의 차이는 아래 블로그에서 정리가 잘되어 있기에 아래 글을 참고하도록 한다.
간단히 설명하면 svn은 중앙 서버를 중심으로 소스 관리가 이루어지는 반면, git은 로컬 저장소를 추가하여 Client 별로 개별 소스의 버전 관리 기능이 추가되어 중앙집중 저장소를 사용하는 SVN의 단점 극복하였지만 SVN 비해 사용 방법이 복잡하다.
git 저장소를 사용하기 위해 git 서버를 직접 설치하여 사용하거나 무료 git 저장소인 GitLab 또는 GitHub를 많이 사용한다. GitLab과 GitHub는 개인 사용자에게 한 해, 무제한 저장소 생성이 가능하기 때문에 많은 사람들이 사용하고 있다.
git은 두개의 저장소를 갖고 있으며, 각 저장소는 다음과 같은 특징을 갖으며 Git 사용에 있어 가장 중요한 개념이다.
- 로컬 저장소
- 자신의 작업 컴퓨터에 저장
- commit 명령어를 사용하여 소스 변경 사항 적용
- 원격 저장소
- 네트워크에 연결된 서버에 저장
- push 명령어를 사용하여 로컬 저장소의 최종 변경사항을 원격 저장소에 업로드
git은 다음과 같은 일련의 과정을 반복적으로 실행하며 사용한다.
1. GitHub 저장소 생성(git init) 또는 복제 (git clone)
2. 소스 파일 수정
3. 소스 파일 변경에 대한 git index(track) 추가 (git add)
4. 로컬 저장소에 커밋 (git commit)
5. 원젹 저장소에 푸쉬 (git push)
저장소 생성 후, 작업 파일은 버전 관리되도록 로컬 저장소에 인덱스하고 변경 사항을 로컬 저장소에 반영하도록 한다. 이러한 일련의 과정을 staging 이라고 한다.
로컬 저장소에서 모든 작업이 완료되면 원격 저장소에 반영하기 위해 업로드 과정을 거치게 된다. 이 업로드 과정을 push라 한다. 원격 저장소 뿐만 아니라 네트워크에 연결된 다른 로컬 저장소에도 업로드가 가능하지만, 이것은 나중에 살펴보도록 하자.
1. 저장소 생성
mkdir ~/Test
cd ~/Test
git init
위 과정은 Test 디렉토리를 생성 후, 이 디렉토리를 로컬 저장소로 생성한 것이다. Test 디렉토리에 .git 디렉토리가 생성된 것을 확인할 수 있으며, 이제 Test 디렉토리의 생성되거나 변경되는 파일에 대해 버전 관리가 가능하다.
2. 소스 파일 추가 및 수정 그리고 로컬 저장소에 반영
$ vi ~/Test/HelloWorld.py
print("Hello World !!!")
Test 디렉토리에 HelloWorld.py 파일은 추가하였으나, 로컬 저장소의 관리되는 파일로 등록하지 않았기 때문에 git status로 현재 상태를 확인하면 아래 이미지와 같이 출력되는 것을 확인할 수 있다.
HelloWorld.py 파일을 인덱싱할 수 있도록 아래의 명령어를 사용하여 이 파일을 추적할 수 있도록 한다.
git add HelloWorld.py
add 옵션을 사용하여 버전 관리될 파일로 설정한 파일을 아래의 commit 명령어를 사용하여 저장소에 반영할 수 있다.
git commit -m "added HelloWorld.py"
'-m' 옵션은 생략이 가능한데, 생략할 경우 수정된 항목에 대한 로그 파일을 기록하기 위해 vi 또는 nano가 실행되며, 로그를 기록하지 않으면 commit일 실행되지 않는(?) 것 같다.
그리고, 여러 사람이 동시에 작업을 하다보면 충돌이 나는 경우도 있고, 디버깅을 위해 추가한 테스트 코드나 디버그 메시지를 제거할 때 저장소 상태로 버전을 롤백하는 경우 많기 때문에 알아두면 꽤 유용한 기능이 있다.
위 블로그의 글을 간단히 요약하면 로컬 저장소의 버전 롤백은 'reset'을 사용하고, 원격 저장소의 버전 롤백은 'revert'를 사용한다. 참고로 원격 저장소에 push를 한 상태에서 로컬 저장소에서 reset을 실행했다면 push한 리비전 상태의 버전이 아니라면 원격 저장소로 push하는 것은 불가능하다.
3. 원격 저장소 업로드
git 서버를 직접 구성할 수 있지만, GitHub 또는 GitLab이라는 안정적인 무료(개인) 저장소가 있는데, 꼭 서버를 구성해야되는 상황이 아니라면 무료 저장소를 사용하는 것이 좋다.
GitHub을 사용하여 'Test'라는 원격 저장소를 아래 이미지와 같이 생성하였고, 아래의 원격 저장소를 커맨드를 사용하여 로컬저장소와 연결할 것이다.
로컬 저장소에서 원격 저장소를 추가는 아래의 명령어로 추가할 수 있다.
git remote add origin https://github.com/<user id>/<repository_name>
origin은 원격 저장소의 별칭이며, 등록된 원격 저장소 목록은 아래의 명령어로 확인이 가능하다.
git remote -v
로컬 저장소의 내용을 원격 저장소에 반영하려면 아래와 같이 push 명령어를 사용해야 한다.
git push origin master
위 명령어를 실행하면 원격 저장소에 업로드하기 위해 GitHub 아이디와 패스워드를 요구하며, 로그인 과정에 문제가 없다면 origin 이름을 가진 원격 저장소에 로컬 저장소 작업 내용을 반영한다.
Git & GitHub 사용시 가장 많이 사용하는 명령어를 살펴보았는데, SVN과 유사하지만 로컬 저장소와 원격 저장소로 구분지어 작업 파일에 대한 버전 관리로 인해 다소 어렵게 느껴지기 때문에 Git 다른 개념 및 사용법에 대해서는 꾸준히 정리를 할 예정이다.