버전관리도구 VCS(Version Control System) Git 기초

다양한 버전관리 도구 중에서 Git은 새롭고 도전적인 느낌이 물씬 풍기는 버전관리도구다.

오픈소스로 무료인 장점과 함께 유료인 다른 버전관리 도구에 비해서 손색이 없을 뿐더러 아주 가볍다.

하지만 Git을 처음 접했다면 좀 어렵게 느낄 수도 있고 버전관리가 처음이라면 더더욱 그럴 것이다.

프로젝트의 규모가 커질수록 버전관리의 중요성은 높아져 간다. 특히 여러사람이 프로젝트를 진행할 때 각자 자신이 맏은 파트에만 집중해서 결과물을 간단히 합칠 수 있기 때문에 버전관리는 프로젝트 관리의 효율성을 높여준다.

혹은 개발자들에게만 필요한 것 아니냐 할 수 있는데 버전관리도구는 글을 쓰는 사람이나 그래픽 디자인 등등 컴퓨터로 진행하는 모든 작업 파일에 대해서 적용할 수 있기 때문에 컴퓨터로 작업하는 사람에게는 아주 큰 도움을 주는 도구다.

잘 생각해보자. 오늘 했던 작업이 맘에 안들어서 어제 작업부터 다시 하고싶다면 어떻게 할까? 버전관리를 사용하면 명령어 한번으로 간단히 돌아갈 수 있다. 이렇게 어제 했던 작업부터 다시 시작했지만 또 다시 변덕이 생겨 오늘 했던 작업으로 다시 돌아가고 싶다면 역시 또 다시 돌아갈 수 있다. 단지 이 때 필요한 것은 돌아올 수 있는 지점을 만들어 놓는 작업만 해 주면 언제라도 그 지점으로 돌아갈 수 있다. 게임으로 치면 세이브 지점들이라고 생각하면 되지만 차이점은 게임의 세이브 처럼 간단히 덮어쓰기는 하지 않기 때문에 한번 기억된 지점은 잃어버리기 쉽지 않다.

이렇게 특정 시점을 기억하기 위해서 commit 명령을 사용한다. commit을 하는 것은 이전 지점과 commit을 하는 시점의 스냅샷(일종의 복사본)을 만드는 작업이라 보면 된다. 

Git에는 3개의 영역이 있다. 

Git Directory는 스냅샷과 관련 메타 데이터들이 저장되는 디렉토리다. 그림에서 A, B, C, D 의 순서대로 스냅샷이 저장되어 있는데 MASTER는 기본 Branch로서 스냅샷(commit 지점)에 대한 참조를 가지는 것으로 보면 된다. 사용자가 의도적으로 Branch를 만들 놓을 수도 있다. 현재 위 그림에서 MASTER Branch는 가장 마지막 스냅샷 D를 참조하고 있다.

Working Directory는 말 그대로 사용자의 작업 디렉토리다. Git Directory에서 특정 스냅샷을 Checkout해서 작업할 수 있다.

Stage Area는 사용자가 작업한 내용을 commit 하기 전에 올려놓는 영역이라고 볼 수 있다. 이 곳에 올려놓지 않은 파일의 경우는 commit 대상이 아니므로 필요한 것들만 Stage Area에 선별해 올려서 commit 할 수 있다.

아마 위 세 영역에 대한 이해가 git의 가장 중요한 핵심이 아닐까 싶다.

사실 git을 사용하면서도 git에 대해 많은 부분을 이해하지 않은 채 사용하기 때문에 꽤 조심스럽다. 혹여나 history가 엉망이 되거나 git 명령이 제대로 동작하지 않는 경우다. 보통 merge를 할 때 동작하지 않을 때가 있는데 아직 설명할 단계는 아니어서 구체적인 것들은 우선은 생략한다.


그런데 보통 다른 버전관리 도구들은 commit을 할 때 원본은 델타(Δ)를 기록해 둔다. 앞에서 git은 스냅샷을 기록한다고 했다. 스냅샷을 기록하는 것과 델타(Delta)를 기록해 두는 것은 용량차이가 난다. 분면 델타만 기록해 두는 것이 용량이 적을 것이다.

사실 commit 지점의 스냅샷을 기록해 두면 이전 commit 지점의 스냅샷과 비교해서 델타를 구할 수 있다. 그래서 git은 마지막 commit한 스냅샷 나두고 나중에 이전 지점의 스냅샷과의 델타를 계산해서 이전 스냅샷을 델타로 만든다.

업어치나 매치나 매한가지지만 Git 방식이 더 빠를 수 밖에 없다. 왜냐면 사용자들이 필요로 하는 스냅샷은 대부분 가장 마지막에 저장한 스냅샷이기 때문이다. 원본만 그대로 두고 commit할 때마다 델타만 저장하는 방식에서는 가장 최신 스냅샷을 가져오기 위해서 원본부터 시작하는 모든 델타를 다 계산해야 하기 때문에 git 방식이 더 효율적일 수 밖에 없다.

이 댓글을 비밀 댓글로