우리가 개발을 공부하다 보면 자연스럽게 Git과 Github에 대해서 많이 접하게 됩니다.
Git과 같은 소프트웨어를 버전컨트롤시스템(Version Control System)이라고 하는데
오늘은 이 VCS가 어떤 역할을 하는지, 어떤 종류들이 있는지에 대해서 다뤄보고자 합니다.
어떤 파일이 여러번의 수정을 거쳐야하고 각각의 수정 전 상태들도 모두 남기고자 한다면
우리는 보통 파일의 사본을 만들고 파일명 뒤에 _수정, _최종수정등을 붙여가며 기존파일과 구분하곤 합니다.
VCS는 이처럼 파일에 변경사항이 생겼을 때 파일의 수정했던 기록(버전)들을 저장할 수 있는 소프트웨어로
만약 사용자가 모든 수정사항마다 저장 명령어를 사용해 파일의 수정 기록을 남겨놓았다면
사용자는 VCS를 이용해 원하는 특정 수정 시점으로 파일을 돌릴 수 있습니다.
VCS의 역할은 단순히 파일의 수정사항을 저장해놓고 특정 시점으로 돌려주는것 뿐만 아니라
파일을 실수로 삭제하더라도 삭제된 파일을 복구시킬 수 있고,
여러명이 함께 진행하는 프로젝트가 있을 경우 Github와 같은 원격 저장소를 통해 더 안전하고 효율적으로 작업이 진행될 수 있도록 모든 수정사항들을 프로젝트 참여자들의 명령에 따라 동기화 및 저장하며 수정에 대한 정보 (누가, 언제, 어떤 파일을, 파일의 어떤 부분을 수정했는지)를 제공해줍니다.
또한 단순히 코드가 들어있는 파일뿐만 아니라 이미지, txt 파일등도 가능하기 때문에 개발자는 물론이며 디자이너, 기획자외에도 파일의 수정사항을 남겨야 하는 사람들에게도 유용한 소프트웨어입니다.
VCS는 크게 CVCS와 DVCS로 나누어지는데 이제 이 둘의 차이점에 대해 알아보겠습니다.
CVCS는 중앙집중식 버전관리 시스템으로 과거에 주로 사용되던 VCS방식 중 하나입니다.
이 방식은 파일들은 오직 서버에만 저장하고 프로젝트의 참여자들은
작업을 진행할 때 서버로부터 프로젝트의 파일들을 내려받은 후 수정하여 다시 서버로 올리는 방식입니다.
프로젝트 파일이 서버 한곳에만 위치해 있으므로 파일의 버전이 일관적이며
관리자는 서버의 파일만 신경쓰면 되므로 관리하기 편하다는 장점이 있습니다.
하지만 이게 CVCS의 큰 단점이기도 합니다.
위의 그림처럼 서버에만 의존하고 있는 형태이기 때문에 네트워크에 문제가 생길 경우 개발자들은 파일을 받지도 올리지도 못하므로 프로젝트를 진행할 수 없고
만약 서버의 DB에 문제가 생겨 프로젝트의 파일들을 잃어버리게 된다면 복구할 수 없습니다.
또한 커밋(파일의 수정을 기록하는 명령어)시에는 수정사항이 바로 서버로 올라가게 되어 만약 오류나 실수가 있었다면 참여하고 있는 다른 개발자들에게 좋지 않은 영향을 줄 수 있습니다.
이러한 단점들을 보완하고자 최근에 많이 사용되는 Git과 같은 DVCS가 탄생하게 됩니다.
분산형 버전관리 시스템은 현재 VCS중 가장 유명한 Git이 사용하고 있는 방식으로
프로젝트의 전체 파일이 참여자들의 각 컴퓨터와 서버에 분산되어 저장됩니다.
먼저 로컬 저장소(참여자들의 각 컴퓨터 디스크)에 프로젝트파일들을 1차적으로 저장하고
사용자의 명령에 따라 Github, Bitbucket과 같은 원격 저장소(서버 저장소)에도 저장할 수 있습니다.
파일을 서버와 각 참여자들의 컴퓨터에 분산하여 저장할 수 있기 때문에
어느 한쪽에 문제가 생겨 파일이 손상되거나 히스토리가 지워지더라도 다른 쪽에서 받아오면 되기 때문에
쉽게 복구할 수 있습니다.
만약 네트워크 문제로 원격 저장소와 통신이 되지 않는다면 각 참여자들끼리 로컬 저장소내의 파일들을
다양한 방법(이메일 등)으로 주고 받을 수 있어 프로젝트를 계속 진행할 수 있습니다.
DVCS에서는 원격 저장소에 저장하는것이 필수가 아닌 선택사항이고
로컬 저장소에 먼저 저장 한 뒤에 명령이 가능하기 때문에
개발자의 실수로 잘못 커밋을 했더라도 원격 저장소로 올리기 전이었다면 다른 개발자들에게 영향을 주기않고 수정 할 수 있습니다.
CVCS | DVCS | |
---|---|---|
히스토리 저장 위치 | 원격 저장소 | 로컬 저장소 및 서버 저장소 |
커밋 순서 | 참여자 -> 원격 저장소 | 참여자 -> 로컬 저장소 -> 원격 저장소 |
대표 소프트웨어 | CVS, Subversion, Perforce | Git, Mercurial, BitKeeper, Bazaar |