[Git] 버전 관리 시스템(Version Control System)의 역사?
- 본업/etc.
- 2023. 6. 19.
이전 글
2023.06.15 - [본업/etc.] - [Git] 버전 관리(Version Control)란? 그리고 목표는?
VCS란?
버전 관리 시스템(VCS; Version Control System)의 줄임말로 파일 변경 사항을 시간에 따라 기록하고, 필요할 때 특정 버전을 다시 호출할 수 있는 시스템을 말한다.
RCS(Revision Control System)이라고도 한다.
요즘은 주로 소프트웨어의 소스 코드의 변경 사항을 추적하며, 파일이 언제, 누가, 어떻게 변경되었는지를 기록한다.
VCS를 사용하면 개발자의 실수를 쉽게 복구할 수 있고 여러 사람이 협업하는 경우 각자의 작업을 병합하는데 큰 도움이 된다.
가장 널리 사용되는 VCS에는 Git, SVN, Mercurial 등이 존재한다.
버전 관리(VC) vs. 버전 관리 시스템(VCS)
이전 글에서 다루었던 버전 관리(Version Control)과 버전 관리 시스템(Version Control System)이 혼동될 수 있다.
차이는 시스템(system)이 붙냐 안붙냐 차이인데, 여기서 시스템을 '소프트웨어', 혹은 '프로그램'이라고 치환해서 생각하면 된다.
즉, 버전 관리(VC)는 프로젝트의 버전을 관리하기 위한 행위 자체를 말하며, 버전 관리 시스템(VCS)는 이 행위를 일종의 프로그램화 시켜놓은 자동화 소프트웨어라고 볼 수 있다.
Example: "나는 프로젝트를 혼자 개발한다. 그럼에도 불구하고 버전 관리를 하고 있다. 버전 관리에 사용되는 버전 관리 시스템은 Git을 사용하고 있다."
버전 관리 시스템의 역사
버전 관리 시스템(이하 VCS)의 발전은 소프트웨어 개발의 복잡성 증대와 협업이 중요시된 환경에서 출발하였다.
소프트웨어 개발 과정에서는 코드의 변화를 효과적으로 추적하고 관리할 수 있는 도구가 필요했고, 이러한 수요로 인해 여러 가지의 VCS가 등장하게 되었다.
혼자 조사하고 검색하다 보니, VCS의 역사를 모두 다루기에는 분량이 많아져서 정말 굵직한 녀석들 몇 가지로 추려본다.
SCCS(Source Code Control System)
1972~1973년 그 유명한 벨 연구소에서 개발된 최초의 버전 관리 시스템이다.
파일 단위의 버전 관리를 제공하며, 각 파일에 대한 수정 내역을 추적할 수 있었다.
따라서 텍스트 기반의 소스 코드의 여러 버전을 관리하고, 각 버전의 차이점을 추적하는데에 사용되었다.
SCCS는 파일의 각 버전을 '델타(Δ; delta)'라 부르는 변경 내역으로 저장해 필요에 따라 특정 버전을 재구성할 수 있었다.
최초의 형상을 저장한 이후 각 버전을 이전 버전과의 차이점만 추가로 저장해 관리하기 때문에 반복되고 중복되는 소스 코드를 매번 저장하지 않아도 되어 저장 공간을 크게 줄일 수 있었다.
(당시엔 저장 장치가 매우 비쌌다)
그러나 SCCS는 다중 사용자 환경에서 동시성 제어(다수가 하나의 파일을 수정)에 한계가 있었고, 이후에 등장한 RCS나 CVS 같은 더 발전된 VCS에게 밀려났다.
RCS(Revision Control System)
RCS는 1982년에 탄생한 가장 초기의 로컬 버전 관리 시스템 중 하나로, 오늘날까지도 사용되고 있다.
파일 단위의 버전 관리를 제공하며, 각 파일의 변경 내역을 순차적으로 추적하는 것이 주 목적이었다.
(프로그램 뿐만 아니라 개정이 빈번한 텍스트 문서나 구성 파일에도 유용했다.)
하지만 RCS는 로컬 버전 관리 시스템의 특성상 다중 사용자 환경에서의 협업이나 네트워크 상에서의 사용이 제한적이라는 한계를 가졌다.
따라서 주로 개인 사용자가 작업 내용을 관리하는데에 사용되었다.
CVS(Concurrent Versions System)
RCS의 한계를 극복하고자 1990년에 발표된 중앙 집중식 버전 관리 시스템이다.
RCS를 기반으로 개발되었지만, 파일 단위가 아닌 프로젝트 단위의 버전 관리를 제공한다.
또한 클라이언트-서버 구조로 이루어져 여러 사람이 동시에 작업할 수 있는 다중 사용자 환경을 제공한다.
그러나 CVS도 불안정한 동시성 제어, 원격 저장소의 느린 속도 등의 한계를 가지고 있었으며 후에 Subversion으로 대체된다.
SVN(Subversion)
CVS의 한계를 극복하고자 Apache Software Foundation에서 2000년에 발표된 중앙 집중식 버전 관리 시스템이다.
버전 관리의 원자성이라는 개념이 등장해 데이터의 일관성을 유지하게 되었고, 이름 변경, 복사, 삭제 등을 지원한다.
CVS와 동일하게 클라이언트-서버 구조로 이루어져 있고, 클라이언트와 서버는 HTTP, HTTPS 등의 프로토콜로 통신할 수 있다.
따라서 클라이언트는 별도의 Subversion 클라이언트 툴을 설치하지 않아도 웹 기반 인터페이스를 통해 저장소의 소스 코드에 접근할 수 있다.
CVS는 pserver라는 전용 프로토콜을 사용했으며 덕분에 원격에서의 협업이 가능하였지만, 보안적인 측면에서는 많이 부족하였다. 따라서 일반적으로 SSH를 이용해 CVS 서버에 접근하였다. 이는 보안성을 향상시켰지만, Subversion의 HTTP 및 HTTPS를 이용한 접근에 비교하면 설정과 관리를 추가로 해주어야 한다는 번거로움이 이었다.
Subversion은 HTTP 및 HTTPS 뿐만 아니라 svn, svn+ssh와 같은 통신 프로토콜도 존재한다.
그럼에도 불구하고 여전히 중앙 서버가 존재해야 한다는 한계, 그리고 코드의 병렬 개발과 병합에 어려움이 존재했다.
Mercurial
2005년에 발표된 분산식 버전 관리 시스템이다.
조사해보니 앞서 기술한 맥락과는 다르게, 딱히 서브버전의 한계점을 극복하기 위해 등장한 녀석은 아닌 듯 하다.
서브버전과 동일하게 HTTP, HTTPS 및 SSH 프로토콜을 지원하기 때문에 통합 웹 인터페이스를 포함하고 있다.
닉값을 하듯 hg(Mercurial;수은 의 원소 기호)로 시작하는 일관되고 명료한 명령어를 중요시해 사용자가 잘못된 명령어를 입력해 실수로 데이터를 손상시킬 수 있는 상황을 최대한 배제하여 높은 사용성을 제공한다.
또한 Python을 메인으로, C를 서브로 개발되어 성능을 중요시해 큰 프로젝트와 대규모 코드 베이스에 대해서도 고성능을 제공한다.
머큐리얼이 서브버전과 가장 다른 것은 분산식 버전 관리 시스템이기 때문에 다중 사용자 환경에서 모든 개발자들이 각자의 로컬에 전체 저장소를 둘 수 있어서 네트워크가 유실된 상태에서도 충분한 작업을 진행할 수 있다.
Git
2005년 리누스 토발즈가 리눅스 커널 프로젝트를 위해 개발한 분산식 버전 관리 시스템이다.
Linux 커널 프로젝트는 2002년부터 상용 VCS인 BitKeeper를 활용하기 시작했으나 2005년, 오픈 소스 생태계에 깊이 뿌리내려 정착한 Linux와 이윤을 추구하는 BitKeeper 사이에 갈등이 생겨났다.
이러한 상황이 Linux 개발 커뮤니티로 하여금 새로운 방향을 모색하게 되었고, 결국 Linux 창시자인 리누스 토발즈가 주도하는 새로운 VCS 툴 개발의 계기가 되었다.
앞서 다룬 머큐리얼과 동일한 연도에 발표되었고 VCS 종류도 분산식으로 동일하다.
다만 굳이 차이점을 꼽자면 다음과 같다.
먼저 머큐리얼은 사용자 친화적인 인터페이스를 목표로 설계되었다면 Git은 속도, 데이터 무결성, 그리고 Linux 커널과 같은 대규모 프로젝트를 지원하는 능력에 초첨을 맞췄다.
또한 머큐리얼은 일관성, 단순성, 명료성을 추구해 쉬운 사용성을 제공했다면 Git은 다양한 명령어와 옵션을 제공해 높은 유연성을 제공한다.
따라서 개발자가 명령어와 옵션에 익숙해지고 학습하는데에 투자 비용이 조금 큰 편이지만, 이를 숙지하고 숙달하면 더 많은 유연성과 제어권을 얻게 된다.
'본업 > etc.' 카테고리의 다른 글
[Git] Git이란? - #1 Git의 설계 목표 (0) | 2023.06.26 |
---|---|
[Git] 버전 관리 시스템의 종류 (0) | 2023.06.22 |
[Git] 버전 관리(Version Control)란? 그리고 목표는? (0) | 2023.06.15 |
[Tips] 맥 Eclipse 오류 - JVM is not suitable for this product (0) | 2023.04.17 |
[UI/UX] 성공적인 산업 자동화 프로젝트를 위한 7가지 UI 팁 (0) | 2023.03.26 |