형상 관리는 높은 변동성을 동반하는 개발 과정을 체계적으로 관리하고 유지하는 일련의 개발 관리 활동으로, 소프트웨어에 가시성과 추적 가능성을 부여하여 제품의 품질과 안정성을 높인다.
여러 개발자가 참여한 프로젝트 에서 변경 내용에 대한 정보가 기록되지 않은 채 결과물이 바뀌고 있다고 상상하는 것만으로도 카오스가 다름 없다. 무언가 잘못 되었을 때 복구도 어렵고, 각자가 수정한 부분을 전체가 공유할 수도 없으며, 검증되지 않은 채로 결과물이 바뀔 수 있는 리스크가 있기 때문이다. 따라서 우리는 개발을 할 때 발생되는 모든 변경사항에 버전을 부여하여 위와 같은 문제를 방지하고자 버전 관리 시스템을 사용하고 있다.
git이 세상에 나오게 된 이야기를 하려면 리눅스 커널을 떼놓고 말할 수 없다.
리눅스 커널은 연간 4천명 이상의 프로그래머로 부터 7만 5천 이상의 커밋을 기여받고 있는 거대한 오픈 소스 프로젝트인만큼 효율적이고 효과적인 버전 관리가 필수 불가결임을 알 수 있다.
초기의 Linux kernel 개발에 사용하는 버전 관리 시스템은 CVS 였다. 1980년대에 만들어진 client-server 방식의 중앙집중식 소프트웨어로, 파일의 변경과 이력을 중앙 서버에 보관하며 client 는 특정 시점의 프로젝트를 개인 개발 환경으로 가져(check-out)오므로 변경을 중앙 서버에 보내면 중앙 서버는 이를 병합하거나 충돌이 발생하면 거절하는 방식으로 동작하여 팀원간의 협업이 가능했으나, 아래와 같은 개선점이 있었다고 한다.
👉 파일이나 디렉터리의 이동, 이름 변경에 대해 버전 관리가 되지 않음
👉 commit 실패시 롤백이 불가하여 실패 전 파일은 커밋 나머지는 커밋이 되지 않는 이슈
👉 Update/Branching/Tagging Time 동작속도가 느림
👉 커밋 단위가 Change-set이 아닌 개별 파일
리눅스 프로그래머들은 계속해서 CVS의 단점을 극복하기 위한 버전 관리 시스템을 고심해 왔을 것이고 비트키퍼라는 분산형 버전 관리 시스템(DVCS, Distributed Version Control System)을 사용하게 된다. 중앙 집중식 소프트웨어와 달리 중앙 서버와 같은 역할을 하는 서버가 여러 곳에 분산되어 있고, 서버의 데이터를 히스토리부터 시작하여 모두 복제하게 되므로 중앙 서버에 문제가 생기더라도 복원이 쉽고, 지속적으로 개발할 수 있는 독립적이면서도 상호 보완적인 시스템이다.
토발즈는 이와 같이 중앙의 저장소없이 수많은 프로그래머의 작업을 동기화할 수 있는 기능에 찬사를 아끼지 않았다고 한다. 그는 “비트키퍼를 사용한 후 생산성은 두 배가 됐다”라고 2004년 3월 비트키퍼 뉴스에서 이야기한 바 있다.
그러나, 토발즈, 커널 관리 SW 논쟁「종지부 찍다」 와 같은 뉴스에서 알 수 있듯 오픈 소스 프로젝트에 독점 소프트웨어를 사용하는 것에 대한 우려가 있어 왔고, 결국 리버스 엔지니어링 이슈로 비트키퍼의 자유 이용이 철회되게 된다. 이에 토발즈는 새로운 DVCS, Distributed Version Control System을 물색하였으나, 자신의 기준에 맞는 시스템이 없어 직접 오픈 소스 기반의 DVCS개발에 착수한다.
토르발스는 패치를 적용하고 모든 관련 메타데이터를 업데이트하는데 30초가 필요한 소스 관리 시스템의 예를 언급하면서 이것은 리눅스 커널 관리의 요구에 따라 스케일링되지 않아야 하며 여기에서 동료 유지보수자들은 이러한 250개의 동작을 한 번에 수행할 필요가 있다고 언급하였다. 그의 디자인 기준의 경우 패치하는 데에 3초 이상 소요되면 안 된다고 규정하였으며 3가지 사항을 더 추가하였다:
👉 무엇을 하지 "않을지"의 예로 CVS를 들며, 의심이 되면 정확히 반대의 결정을 할 것
👉 분산 방식의 비트키퍼같은 워크플로를 지원할 것
👉 우연이든 악의적이든 변질에 대비한 매우 강력한 안전 기준을 포함할 것
그리하여 탄생한 분산형 버전 관리 시스템이 바로바로 git 인 것이다.