Git은 개발자들 사이에서 가장 많이 쓰이는 버전 관리 시스템으로 코드의 변경 내역을 추적하고 관리할 수 있는 도구이다. 버전 관리 시스템을 사용하면서 변경 사항을 쉽게 확인하고 필요할 경우 이전 버전으로 돌아갈 수 있게 되었다. 또한 Git 저장소에 코드를 올려놓고 개발자의 로컬 컴퓨터에 해당 파일들을 복제해서 작업하고 변경 사항을 다시 중앙 서버로 푸시하는 기능을 제공하기 때문에 협업에 있어서 특히 유용한 서비스이다. 딱히 개발자가 아니더라도 오픈 소스 프로그램을 다운 받을때 Github이라는 페이지로 연결된 적이 있을텐데 이 Github가 Git 저장소를 관리하는 클라우드 기반 서비스의 이름이다. Github를 통해 작업하던 코드를 백업해놓을 수 있을 뿐더러 여러 사람들이 손쉽게 코드를 공유하고 협업하고 기여하는 것이 가능해졌다. 이번 포스팅에서는 기본적인 Git 사용법과 설정법을 설명하려고 한다.
Git에서 코드를 저장하는 공간을 Repository(리포지토리)라고 하며 개인 PC에 위치한 로컬 리포지토리와 원격 리포지토리로 구분되어 있다.
로컬 리포지토리를 만들고 싶다면 터미널에서 원하는 주소로 간 뒤에 git init 명령어를 입력하면 된다. 그러면 그 폴더에 git 리포지토리가 생성된다.
이제 이 디렉토리의 작업 상황을 Git으로 관리할 수 있게 된다. 작업 상황을 올리기 위해서는 우선 staging area에 옮겨야 한다. 이 기능은 git add <경로> 로 가능하다. 원하는 파일이 있다면 해당 파일의 경로를 적으면 되고 이 디렉토리의 모든 파일의 작업 상황을 올리고 싶다면 현재 경로를 의미하는 . 을 사용할 수 있다.
작업 상황이 staging area로 잘 이동했는지, 변경이 있었지만 staging area로 반영되지 않은 파일이 있는지 확인하고 싶다면 git status 명령어를 입력하면 된다. 언급한 내용 외에도 현재 브랜치, 커밋 사항 등등 현재 리포지토리의 전반적인 사항에 관해 출력할 수 있다.
변경 사항을 반영하려는 브랜치도 맞고 원하는 파일들도 모두 stagin area로 옮겨졌다면 이제 git commit 명령어를 입력해서 작업 상황을 commit 할 수 있다.
commit 뒤에는 -m "(commit 메세지)"를 입력해야 한다. commit 메세지란 이 작업 상황에 대한 간결한 설명이다. commit 메세지를 토대로 개발자들은 해당 변경 사항이 어떤 내용을 작업한 것인지 알 수 있고 만약 문제가 생긴다면 이것을 토대로 버전 관리를 할 수 있다. 팀에 따라 어떻게 적을 것인지 컨벤션을 정해놓고 맞춰서 commit 메세지를 쓰게 되며 혼자 작업하더라도 버전 관리 및 추적이 쉽게 짧지만 정확하게 쓰는 것이 좋으며 공개된 리포지토리라면 다른 사람들도 보고 쉽게 이해할 수 있게 작성하는 것이 좋다.
이제 로컬 리포지토리를 생성하고 작업 상황을 원격 리포지토리로 올릴 수 있는 준비까지 마쳤다. 원격 리포지토리는 Github에서 생성할 수 있다.
그 다음엔 로컬 리포지토리와 원격 리포지토리를 연결해야 한다. 이것은 git remote add (이름) git@(URL) 으로 가능하다. 이름은 이제부터 로컬 리포지토리에서 원격 리포지토리의 주소를 대신해서 부를 이름이며 URL은 원격 리포지토리 주소이다.
잘 연결됬다면 git remote -v 명령어를 입력했을때 원격 리포지토리 주소가 출력된다. 이제 로컬 리포지토리에 commit된 내용을 원격 리포지토리로 옮길 수 있으며 명령어는 git push (이름) (branch)이다. 이름은 방금 위에서 정했던 원격 리포지토리를 부를 이름이며 branch는 그 리포지토리 중에서도 어떤 branch에 작업 상황을 올릴 것인지를 정하는 부분이다. 참고로 push 명령어에서 유용하게 사용할 수 있는 -u 옵션이 있는데 이는 현재 로컬 branch와 원격 branch 사이의 트래킹 관계를 설정해서 다음부터는 git push 만으로도 진행이 가능하게 설정하는 기능이다. 물론 트래킹 관계를 설정하지 않아도 branch 이름을 명시적으로 적으면 되기 때문에 상황에 따라 선택하면 된다.
직접 로컬과 원격 리포지토리를 만들어서 프로젝트를 진행할 때도 있지만 공개되어 있는 다른 원격 리포지토리를 나의 원격 리포지토리로 가져와야 할 때도 있을 것이다. 그 때 할 수 있는 것이 fork이다.
fork가 완료되면 이제 나의 원격 리포지토리가 되며 내가 여기서 작업한 것은 원본에 영향을 미치지 않는다. 이제 이것을 나의 로컬 리포지토리로 가져오고 싶다면 원하는 경로에서 git clone을 사용하면 해당 원격 리포지토리의 내용을 로컬 리포지토리로 만들어서 나의 PC로 가져올 수 있다. 이 때는 따로 git init처럼 로컬 리포지토리를 만들고 원격 리포지토리와 연결하는 과정이 필요 없다.
내가 작업한 사항을 원본에 적용하고 싶다면 Pull Request라는 것이 가능하다. 이러면 원본 리포지토리의 관리자가 해당 Pull Request를 확인할 수 있고 해당 내용을 원본에 적용하거나 반려할 수도 있다. 또한 한 branch에서 다른 branch로 내용을 바로 push하는 것이 아니라 리뷰를 통해서 적용하는 경우도 있는데 이것도 Pull Request로 할 수 있다.
이미 있는 원격 리포지토리에서 처음으로 로컬 리포지토리를 만들때는 git clone이었지만 로컬과 원격 리포지토리가 둘 다 이미 존재하고 원격 리포지토리의 작업 상황을 로컬 리포지토리로 가져오기 위해서는 clone이 아닌 git pull (이름) (branch) 명령어를 사용해야 한다. push 명령어와 같이 이름은 설정했던 원격 리포지토리 이름이고 branch는 변경 사항을 가져올 branch 이름이다. pull 명령어는 원격 리포지토리 변경 사항을 로컬 저장소로 가져오게 되고 그 후에 내용을 병합하게 된다. 이 과정에서 충돌이 발생할 수 있으며 그럴 경우엔 충돌을 해결하고 변경 사항을 다시 commit해야 한다. 이때도 충돌을 확인하기 위해 git status 명령어를 사용해서 확인할 수 있으며 사용하고 있는 IDE에 따라서는 git status 명령어 없이도 충돌 상황을 비교해서 사용자에게 보여주고 바로 수정할 수 있는 기능을 제공하기도 한다. 수정이 끝났다면 위에서 설명한 commit 과정을 진행하면 된다.
branch는 나뭇가지라는 원래 단어의 뜻처럼 github에서는 코드의 베이스에서 나온 여러 갈래를 의미한다. branch를 나누어 놓으면 서로 영향을 주지 않기 때문에 여러 사람이 한 리포지토리에서 각자의 분량을 동시에 작업이 가능하다. 각자 개별 브랜치에서 작업을 진행하고 코드를 검토한 뒤에 하나의 주가 되는 branch에 병합함으로써 충돌을 최소화하고 변경 사항을 체계적으로 관리할 수 있게 된다.