버전 관리 시스템
VCS, Version Control System
- 사본 생성, 보존, 복원을 용이하게 해주는 도구이다.
- 협업 프로젝트에서 서로 간에 상태를 똑같게 유지하는 기능을 제공한다.
- 팀 단위로 개발 중인 소스 코드나, 청사진 같은 설계도 등의 디지털 문서를 관리하는 데 사용된다.
* 동의어 : 소스 관리(Source Control), 소스 코드 관리(SCM, Source Code Management)
버전 관리 시스템의 종류
1. 클라이언트-서버 모델 (Client-Server Model)
- 하나의 중앙 저장소를 공유한 후 각각의 클라이언트(개발자)는 저장소의 일부분만을 갖는 형태이다.
- 자신이 작업하는 부분만 로컬에 임시로 저장한 후 작업하는 형태이다.
- 중앙 저장소에서 프로젝트 관리의 모든 것을 처리한다.
- 클라이언트(로컬)에서 할 수 있는 것은 파일 수정, 서버로의 커밋(Commit) 등으로 그리 많지 않다.
- 서버가 고장날 시, 불완전한 로컬의 파일 사본들만 남게되어 복구가 힘들다.
Free/Open Source VCS
- CVS (1986)
- CVSNT (1998)
- QVCS (1998)
- Subversion, SVN (2000)
Charged/Commercial VCS
- Software Change Manager (1970s)
- Panvalet (1970s)
- Endevor (1980s)
- DSEE (1984)
- Surround SCM (2002)
- Team Foundation Server (2005)
- Rational Team Concert (2008)
2. 분산 모델 (Distributed Model)
- 프로젝트에 참여하는 모든 클라이언트(개발자)가 전체 저장소에 대한 개별 로컬 저장소를 갖고 작업하는 형태이다.
- 각자가 온전한 전체 저장소의 사본을 로컬에 가지는 형태이다.
Free/Open Source VCS
- GNU arch (2001)
- Darcs (2002)
- DCVS (2002)
- ArX(2003)
- Bazaar (2005)
- Git (2005)
- Mercurial (2005)
- Fossil (2007)
- Veracity (2010)
Charged/Commercial VCS
- TeamWare (1990s)
- Code Co-op (1997)
- BitKeeper (1998)
- Plastic SCM (2006)
대표적인 VCS
1. CVS (Concurrent Versions System)
- 1986년 Dick Grune 이 개발한 클라이언트 - 서버 모델 VCS 이다.
- 서버 저장소에 프로젝트의 온전한 원본이 있고, 클라이언트는 각각의 서버에서 파일을 Check out(가져가기) 하여 로컬 저장소에서 작업한 뒤 변경 내역을 다시 서버에 Commit(보내기)한다.
- 파일 각각의 버전을 관리 및 추적할 수 있으나 파일 이름이 변경되거나 이동되는 것을 자동으로 추적하지 못한다.
- 프로젝트의 완전한 버전은 오직 서버에만 존재하여, 서버에 사고가 생길 경우, 복구하기가 어려운 편에 속한다.
2. Subversion (SVN)
- CVS와 완벽히 호환되며 CVS의 단점을 개선한 클라이언트 - 서버 모델 VCS 이다.
- 2000년 collab.net 에서 개발했다.
- 현재 Apache 최상위 프로젝트가 되어 전 세계 개발자 커뮤니티에서 공동 개발 및 관리 중에 있다.
- 각각의 Commit이 원자적인 특성을 가진다.
- 파일 이름 변경, 복사, 이동, 삭제 등의 작업 내역을 유지하는 History를 생성시킨다.
- CVS에서의 branching에 대비해 Subversion에서의 branching은 더욱 가볍게 수행된다.
- branching의 병합 내역 추적이 가능하다.
- Branch 각각에 이루어지는 tagging 기능이 원활하게 연동되지 않는다.
* Branch : 버전 관리 시스템에서 서로 영향을 받지 않는 작업 단위
3. Mercurial
- 2005년에 Matt Mackall이 개발한 분산 모델 VCS 이다.
- VCS에 필요한 모든 기능을 한 번에 통합하여 제공한다. (Git은 이와 반대로 기능의 선택이 가능하다.)
- Python으로 개발되었다.
- 명령어 대부분이 Subversion과 겹친다. (Mercurial은 모든 명령어 앞에 접두어 "hg"(수은)이 붙는다.)
- Git과 달리 프로젝트의 Commit 내역이 변경 불가하다.
- 현재 Google에서 이 시스템의 관리를 지원중이다.
4. Git
- 2005년에 Linus Torvalds가 개발한 분산 모델 VCS 이다.
- Linus Torvalds가 리눅스 커널 버전 관리를 위해 BitKeeper를 이용하고 있었으나,
BitKeeper측에서 무료 이용을 거부한 후 열이 뻗쳐 개발한 VCS 이다. - 리눅스 커널과 같은 대형 프로젝트의 버전 관리가 가능하다.
- 전 세계의 수많은 사용자가 이용하고 있으며 이로 인해 나오는 어마어마한 양의 Tutorial과 Project가 존재한다.
- Git을 사용한 저장소를 공유 사이트인 GitHub를 제공하고 있다.
* Git의 특성
- Master 저장소 서버와 Master의 완전한 사본을 가진 클라이언트 저장소로 구성
- 로컬 및 원격 저장소 생성
- 로컬 저장소에 파일 생성 및 추가
- 수정 내역을 로컬 저장소에 제출
- 파일 수정 내역 추적
- 원격 저장소에 제출된 수정 내역을 로컬 저장소에 적용
- Master에 영향을 끼치지 않는 Branch 생성
- Branch 사이의 Merge 기능
- Branch를 Merging하는 도중의 Conflict(충돌) 감지 기능