Git
최근 웹프레임워크를 개발하면서 협업하기 좋은 소스 관리 저장소를 사용하기 위해 깃(Git)
을 선택했다. 처음 접한 깃은 SVN과는 개념이 달라 적응이 조금 어려웠지만 문제될 정도는 아니였다.
이걸 비결이라고 할 수 있을지는 모르겠는데, 조금 특이한 걸 말씀드리자면 제가 개인적으로 성공한 프로젝트는 전부 목표를 별로 높지 않게 잡은 것이 었어요. 정말 큰 성공을 거두겠다는 목표를 가지고 시작한 일은 없었죠.
- 리누스토르발즈 "프로그래머로 사는 법 중에서..."
그래서 만든 것이 리눅스(Linux)
와 깃이고 시작은 작았지만 어마어마하게 커진 프로젝트이다.
깃은 깃허브(Github)
에 의해 유명해졌고 깃허브 또한 깃으로 인해 큰 규모의 회사로 성장했다.
이제부터 깃은 어떤 기능들이 있는 하나하나 알아보자.
깃은 로컬 저장소로 부터 시작되며, 서버 저장소가 없어도 소스를 관리할 수 있다. SVN과는 크게 다른점이다.
깃이 유명하기 전에 SVN이 인지도가 높았다. (구글 호스트에서 무료 SVN을 지원하면서 오픈소스 진영에서 점차 인지도를 높였지만 깃허브에 의해 많은 개발자들이 구글 호스트를 떠났다.)
로컬 저장소만 있으면 깃을 사용할 수 있다. SVN은 서버 저장소가 있어야만 클라이언트(로컬)에서 소스를 서버로 전송하여 소스를 관리할 수 있게된다. 무조건 서버를 경유해야하기 때문에 SVN은 깃보다 느릴수 밖에 없다. 깃은 PC 자체에서 소스가 관리(로컬 저장소)하고 필요할 경우 서버(서버 저장소)로 전송하면 된다. 당연히 로컬에서 작업이 모두 끝난 정보를 서버로 전송하는 깃의 방식이 매우 효율적인 방법이다.
로컬 저장소에 작업내용을 전송하는 행위를 커밋(commit)
이라고 한다. 소스를 공유하기 위해 서버로 전송하는 행위를 푸쉬(push)
라고 한다. 이렇게 관리된 소스를 내려받는 행위를 풀(pull)
이라고 한다. 풀은 두가지 명령어를 한번에 수행하는 데 그것이 패치(fetch)
와 병합(merge)
이다. 패치는 서버와 로컬의 정보를 비교하여 변경된 사항을 수집하고 병합은 서버와 로컬의 자료를 서로 합치는 작업이다.
서버 저장소의 자료를 내려받으려면 딱한번 클론(clone)
작업을 진행해야 한다. 로컬저장소를 생성하기 위해 init
을 사용한다.
깃에서 가장 핫한 기능은 브랜치
이다. 프로그램을 개발하다보면 1버전과 2버전으로 소스를 나뉘게 될때가 있다. 더 자세히 말해 1버전은 자바6이하까지 지원하고 2버전은 자바7이상만 지원하는 프로그램 코드를 작성해야할 경우... 이럴때 브랜치로 둘을 분리한다. (한 브랜치에서 둘의 소스를 폴더로 분리하지 않는 이상 관리할 수 없다.)
이렇게 되면서 소스를 효율적으로 관리할 수 있고 1버전과 2버전의 소스 상태를 쉽게 변경할 수 있게 된다. 브랜치를 변경하면 해당 폴더의 파일정보는 모두 변경되게 된다. (해당 브랜치의 파일정보)
만약 작업중 변경된 소스를 모두 원래상태로 되돌리고 싶다면 초기화(reset)
하면 된다. 그리고 실수로 커밋을 하거나 병합을 할 경우에도 현재 기록을 모두 제거하거나 유지하면서 과거로 되돌아 갈 수 있다. (현재 브랜치를 해당 커밋으로 이동)
과거로 돌아갈때 문제는 서버저장소에 커밋된 정보가 있으면 좀 어려워진다. 로컬저장소의 커밋은 과거로 쉽게 돌아갈 수 있는 데 서버저장소의 커밋정보를 돌리는 방법은 아직 파악하지 못했다. 그래서 난... 새로운 서버저장소를 만들어 과거로 돌아간 로컬저장소를 다시 푸쉬하는 방법으로 해결했다...
# 깃의 병합
깃의 병합을 설명하면 현재 브랜치 기준으로 두 브랜치가 병합된다. 현재 브랜치가 우선순위가 된다. 병합하고자하는 브랜치를 정보가 현재 브랜치로 오게되는 것이다. 한 파일 전체로 비교하는 것이 아니라 라인하나하나 비교하기때문에 충돌 발생이 적다.
버전 관리는 태그(tag)
를 사용하면 된다. 하위 버전을 지원하지 않을 경우에만 브랜치로 분리하고 전체 버전정보는 태그를 사용하여 표시한다. 태그는 해당 위치를 쉽게 구별하기 위해 표시하는 기능이다.
소스를 배포할 때 아카이브(archive)
를 이용해서 소스를 압축할 수 있다. 또한 특정 커밋 범위의 변경되거나 추가된 소스만 따로 압축할 수도 있다.
# 특정 범위의 변경되거나 추가된 소스만 압축하기 (윈도우인 경우 파워쉘로 명령어를 실행한다.)
git archive -o 압축파일명 HEAD $(git diff --name-only 커밋id..커밋id)
커밋id 대시 태그를 사용할 수도 있다.
깃에는 다양한 기능들이 많아 배워야 할 것이 많지만 이정도만 알아도 프로젝트 관리에 도움이 된다.
# 유용한 툴
서버 저장소용 추천 플랫폼은 아무래도 깃허브만한 것이 없다. 하지만 소스가 오픈되어야 하는 불편함이 있다. 소스를 오픈하지 않으려면 유료 서비스를 이용해야한다. 지라(jira)
라는 서비스도 있지만 유료이다. 하지만 국내에 요비(yobi)
라는 네이버에서 서비스하는 오픈소스 프로젝트가 있다. 유료 못지않게 훌룡한 플랫폼이다.
깃 GUI 프로그램(클라이언트)으로는 소스트리(source tree)
를 추천한다. 무료라는 게 정말 놀랍고 유료라도 구매할만한 충분한 프로그램이다. 윈도우용은 한글이 잘되어 있지만 맥용은 아직 지원하지 않는 것 같다. 한글이 아니더라도 사용하기에는 큰 무리가 없다.
Github: https://github.com/
Yobi: http://yobi.io/
Source Tree: https://www.sourcetreeapp.com/
JIRA: https://ko.atlassian.com/software/jira