index
version control system
소프트웨어 개발에서 버전이란 코드나 파일의 특정 시점에 대한 스냅샷을 의미한다
작업 결과물의 변경 사항을 기반으로 새로운 버전이 만들어지며 이 버전을 통해 버전 관리 도구가 코드나 파일의 변경 이력을 기록하고 추적할 수 있게 해주는 기능을 제공한다
개발자는 버전 관리 시스템을 통해 코드의 변경 이력을 살펴보고 코드를 과거 상태로 되돌리거나 여러 사람이 작업할 때 충돌을 관리한다
형상 (configuration)이란 소프트웨어 시스템이나 프로젝트를 구성하는 모든 요소(코드, 문서, 설정 파일, 데이터베이스 스키마, 의존성 라이브러리 등)의 구조와 구체적인 상태를 뜻한다
특정 시점에 이 요소들이 어떤 버전으로 조합되어 있고 어떻게 동작하는지를 정의한 스냅샷과 같은 개념으로 버전과 유사하지만 전체 프로젝트를 아우르는 넓은 범위를 의미한다
예를 들어 v1.0 배포판
의 형상은 소스 코드 버전 1.0, 특정 설정 파일, 사용된 라이브러리 버전까지 모두 포함한 상태를 말한다
형상 관리(configuration management)는 이러한 형상을 체계적으로 관리하고, 필요할 때 재현하거나 변경을 추적할 수 있게 해주는 프로세스를 말한다
버전 관리는 형상 관리를 이루는 일부분으로 주요 차이점은 다음과 같다
구분 | 버전 관리 | 형상 관리 |
---|---|---|
목적 | 파일 변경 이록 기록, 히스토리 관리 | 시스템 전체 구성 요소 통합 관리, 특정 시점의 완성된 상태를 유지하거나 재현 |
범위 | 소스코드 또는 문서와 같은 개별 파일 | 소스 코드, 설정 파일, 환경 변수, 빌드 도구, 하드웨어 요구사항 등 |
초점 | 시간에 따른 변화 추적(이 파일이 언제 어떻게 바뀌었는지) | 시스템의 일관성 유지(이 시스템이 제대로 동작하려면 어떤 요소들이 어떤 상태여야 하는지) |
도구 | Git, SVN, Mericurial | Ansible, Puppet, CI/CD Pipeline |
Git
Git은 2005년 리누스가 리눅스 커널 개발을 하기 위해 빠르고 안정적인 VCS가 필요해서 만 든 분산형 버전 관리 시스템이다
속도, 단순성, 분산을 목표로 설계되었으며 주요 특징은 다음과 같다
distributed version control
기존 svn(subversion) vcs에서 중앙 서버에 코드와 변경 이력을 두고 버전 관리를 하는 중앙 집중형 구조를 채택했는데, 서버가 다운되면 작업을 진행하기 어려운 단점이 있었다
Git은 svn의 치명적인 단점을 해결하기 위해 중앙 서버에 완전히 의존하지 않고 모든 개발자가 로컬 호스트에 저장소의 전체 복사본(코드, 변경 이력)을 둘 수 있게 한다
원격 저장소와 연결하지 않아도 (인터넷으로부터 분리되어도) 로컬에서 독립적으로 작업을 진행할 수 있으며 중앙 서버가 다운되더라도 작업이 멈추지 않는다
extremely fast
대부분의 작업을 로컬에서 처리할 수 있기 때문에 네트워크 의존도가 낮다
변경 이력을 기록할 때 파일의 전체 복사본을 저장하기 않고 변경된 부분만 저장하는 델타 기반 스냅샷 방식을 사용한다
또한 압축 알고리즘으로 저장소 크기를 줄여 효율성을 높인다
powerful branch/merging feature
브랜치는 저장소의 독립적인 작업 경로로 새로인 기능을 개발하거나 버그를 수정할 때 사용하며, 병합되거나 히스토리를 정리할 수 있다
여러 작업을 병렬로 실행할 수 있어서 팀 협업이나 분리된 기능 개발에 유리하다
실험적인 작업을 하다가 실패해도 메인 코드에 영향을 주지 않는다
ensure data integrity
git은 데이터의 무결성을 보장하기 위해 모든 커밋과 파일에 SHA-1 해시 값을 부여한다
각 커밋은 고유한 40자리 해시로 식별되며 데이터가 손상되거나 변조되면 해시 값이 달라져 바로 감지할 수 있다
이를 통해 코드의 신뢰성을 높이고 실수로 손상된 데이터를 쉽게 복구한다