버전 관리 시스템(Version Control System)
파일의 변화를 시간에 따라 버전별로 기록한다. 나중에 특정 시점의 버전을 다시 꺼낼 수 있는 시스템이다.
- 버전 관리 시스템은 제품명이 아니다. CVS, SVN, GIT 등이 있다.
- CVS는 예전에 유행했던 동시 버전 관리 시스템으로 한계를 겪게 된다.
- 이를 대체하는 서브버전(Subversion)은 자유 소프트웨어 버전 관리 시스템이다. SVN이라고도 한다. 현재까지 많이 사용하고 있다.
- GIT은 오늘날 가장 많이 사용하는 버전 관리 시스템
0. 버전 관리 시스템의 특징
- 각 파일이나 프로젝트를 이전 상태로 되돌릴 수 있다.
- 시간에 따라 수정 내용을 비교할 수 있다.
- 누가 언제 문제를 일으켰는지 추적이 가능하다.
- 버전이란 어떤 프로그램을 수정, 개선하여 완성한 것이다. 버전을 부여하기 위해서 소스 코드를 구별할 수 있는 의미 있는 변화가 있어야 한다. 개발 도중 임시로 작업한 건 버전이라고 하지 않는다.
- 개발자뿐만 아니라 디자이너 또한 VCS 사용한다. 이미지, 레이아웃 버전을 관리할 수 있음 즉 거의 모든 컴퓨터 파일 버전 관리함
1. 디렉토리로 파일을 복사하는 방법
파일을 여러 이름으로 바꾸면서 저장
2. 로컬 VCS
간단한 데이터베이스를 사용하여 파일의 변경 정보를 관리한다.
ex) 파일의 이름을 언제나 리포트.xls라고 하고 파일의 내용이 바뀌는 변경 사항들은 컴퓨터로 관리를 하게 된다.
- RCS(Revision Control System) : Patch Set 관리함
- patch set : 파일에서 변경되는 부분으로 특별한 형식의 파일로 저장함
- checkout : 파일을 사용한다
3. 중앙집중식 버전 관리 (CVCS)
SCCS: 1970년대 최초의 버전 관리
RCS: 1980년대 정방향/역방향 개념 도입
CVS: 1986년
SVN: 2000년
- 서버가 별도로 있고 클라이언트가 중앙 서버에서 파일을 받아서 Checkout한다.
- 누가 무엇을 하고 있는지 알 수 있다.
- 중앙 서버 다운되면 큰일난다.
- 중앙 데이터베이스가 있는 하드디스크 문제 생기면 프로젝트의 모든 히스토리를 잃는다.
- 사람마다 하나씩 가진 스냅샷은 괜찮다.
- 이건 로컬 vsc도 마찬가지 아니냐
4. 분산 버전 관리 시스템 (DVCS)
Git, Mecurial, Bazaar, Darcsem 등
- 파일의 마지막 스냅샷을 checkout하지 않고 저장소와 히스토리를 모두 복제한다.
- 서버에 문제가 생겨도 복제물로 다시 작업 가능하다.
- 클라이언트 중에서 아무거나 골라도 서버를 복원할 수 있다.
- Clone은 모든 데이터를 가진 백업이다. clone을 통해 매번 중앙 저장소를 조회하지 않아도 개발을 진행할 수 있다.
GIT
1. GIT의 역사
리눅스 커널은 오픈소스 프로젝트로 2002년까지 Patch와 단순 압축파일로만 관리하다가 BitKeeper라고 불리는 상용 DVCS를 사용하기 시작했다. 2005년에 BitKeeper가 유료화되자 Linux 개발 커뮤니티(특히 Linus Torvalds)가 자체 독구를 만드는 계기가 됐다.
- 본질적 요소 : 버전 컨트롤 시스템 전체를 관통하는 공통점이 있다. 변경사항을 관리한다. = 보편적이고 쉽다 = 필요하다.
- 혁신적 요소 : CVS를 SVN이 무너뜨릴 수 있던 점, 그 SVN을 git이 뛰어넘을 수 있는 차이점이다. 편리하지만 어렵다.
2. GIT이 어려운 점
- Why is it difficult to use GIT?
- 깃의 복잡성이 코드의 복잡성보다 크면 프로젝트의 복잡성이 커진다. 그럼 왜 쓰냐! 어렵기만 한데! 깃을 배워야만 한다는 당위성이 없다. 현명하게 적절한 수단을 선택해야 한다.
- 깃의 복잡성보다 코드의 복잡성이 크면 프로젝트 복잡성이 훨씬 지옥이라 깃을 배울만하고 도입해야만 하다.
코드가 가벼우면 드랍박스 사용해보고 깃이 무엇인지만 알아두자. 재미없어지면 필요없는 이야기라는 뜻이다.
그럼 배우는 것을 그만하고 프로젝트부터 진행해야 한다. 무엇인지를 알게되면 정말 필요할때 언젠가 배울것이다. 뭐가 뭔지를 아는 것은 이미 알고 있는 것과 다름없다 생각한다.
3. GIT 사용 이유
대부분의 DVCS 환경은 하나 이상의 원격 저장소(remote repository)가 있다. 그래서 동시에 다양한 방법으로 협업이 가능하다.
계층 모델과 같은 CVCS로는 할 수 없는 워크플로우를 다양하게 사용할 수 있다.
4. GIT 특징
- 대표적인 분산형 버전 관리 시스템이다.
- 개발자 각각의 로컬 컴퓨터에 복제본 소스 코드를 저장할 수 있다.
- 매번 중앙 저장소를 조회하지 않아도 개발 가능하다.
- 인터넷이 안되도 로컬 컴퓨터의 소스 코드만으로 버전을 관리할 수 있다.
- 직접 만든 새로운 소스 코드를 배포하거나 내려받은 소스 코드를 수정한 후 다시 merge할 수 있다.
결국 단순하게 보면 백업 기능이 있고 협업 개발에 유용하다.
백업 기능
혼자 개발하더라도 컴퓨터에 문제가 생기면..? 끔찍..
- 깃을 통해 코드를 원격 저장소에 저장하면 저장된 내용을 다시 내려받아 개발 가능
협업 개발
- 코드 공유
깃을 사용하면 네트워크를 통해 코드를 좀 더 쉽게 공유한다.
- 책임과 기록
깃은 커밋(commit)을 거쳐 모든 코드의 수정 이력을 기록한다.
- 원격 공유
- 깃에서는 원격 저장소가 중앙 서버 역할을 한다.
- 자신의 코드 저장소를 원격 서버에 푸시(push)하여 저장(동기화)한다.
- 다른 개발자의 소스를 원격 서버에서 풀(pull) 또는 패치(fetch)하여 언제든지 내려받을 수 있다.
참고
1. 생활코딩 - 프로젝트 관리
2. pro git book
3. The Book