6 분 소요

여러명의 사람들과 함께 공통적인 프로젝트를 진행할 때, 어떻게 소스 코드를 안정적이고 효율적으로 개발할 수 있을까?

이를 위해서 등장한 것이 버전 관리의 개념이다.

이런 개념을 활용한 시스템을 VCS(Version Control System, 버전 관리 시스템) 이라고하며 대표적으로 Git, SVN이라는 플랫폼이 존재한다.

그렇다면 버전 관리 시스템은 어떤 기능을 가지고 어떻게 활용하며 전세계적으로 많이 활용하는 Git은 무엇일까?

Version Control System, 버전 관리 시스템

우리는 보통 버전이라 하면 어느 한 애플리케이션에서 수정 혹은 추가되는 부분이 있을 때마다 버전을 변경하며 이전과는 다르다는 것을 구분할 때 사용하는 방식이다.

사용자의 입장에서는 단순히 기능이 변경된 것만 알면 되지만, 개발자 입장에서는 언제 어디서 어떻게 소스가 변경 되었는지 알아야 안정적으로 시스템을 개발하고 관리하는데 유리할 것이다.

그리고 버전 관리 시스템은 이러한 행위를 간편하고 정형화 된 행위 안에서 진행할 수 있도록 도와주는 소프트웨어를 의미한다.

VCS를 이용하여 여러 개발자가 동시에 작업할 수 있으며, 변경 사항을 쉽게 추적하고 필요 시 이전 버전으로 롤백할 수도 있다.

주요 기능

변경 이력 추적

• 모든 코드 변경 사항을 기록하여 언제, 누가, 어떤 변경을 했는지 추적할 수 있다.

• 변경 이력은 필요 시 특정 시점으로 되돌릴 수 있다.

소스 공유

• 여러 개발자가 동시에 같은 프로젝트에서 작업할 수 있도록 지원한다.

• 브랜치와 병합 기능을 통해 독립적인 작업 공간을 제공하고, 각 작업을 통합할 수 있다.

백업 및 복구

• 코드의 변경 이력을 저장하여 데이터 손실 시 안정적인 버전으로 복구할 수 있다.

• 이전 버전으로 쉽게 되돌릴 수 있어 실수나 오류를 쉽게 수정할 수 있다.

비교 및 병합

• 코드의 변경 사항을 비교하여 차이를 확인할 수 있다.

• 여러 개발자의 작업을 병합하여 하나의 코드 베이스로 통합할 수 있다.

등이 있다.

VCS를 활용한 운영법

여러명과 함께 프로젝트를 진행한다면 모두 같은 도메인의 소스 코드를 수정하는 것은 충돌이 나기도 쉽고 전문성이 떨어질 수도 있다.

이를 위해서 개발 하는 영역을 분리하고 각자의 소스 코드를 작성하고 이를 통합하는 과정이 필요할 것이다.

특히 Git의 경우에는 분리/통합의 개념에 특화되어 Branch라는 일종의 Stream을 분리하여 각 특성에 맞는 소스 코드를 개발하고 이를 VCS에 반영한다.

아래는 일반적인 VCS에서의 소스 코드 반영 과정이다.

  1. 전체 소스를 관리하기 위한 저장소를 생성한다. (Repository 생성)
  2. 팀원들은 생성된 Repository에 접근하여 소스를 자신의 로컬에 불러온다. (Checkout)
  3. 소스 코드를 수정하며 개발을 진행한다.
  4. 여러명과 함께 개발을 진행할 시 변경된 최신 반영 소스 코드를 불러온다. (Fetch / Pull)
  5. 수정 사항에 대한 Comment를 작성하여 변경된 소스 코드를 반영한다. (Commit / Push)
  6. 필요 시 팀원들은 반영된 소스의 수정 사항을 확인하고 본인 소스와 비교 / 업데이트한다.(Diff / Update)

물론 항상 위의 과정을 거치는 것은 아니다.

문제가 발생했을 시 이전 버전의 소스 코드를 다시 불러올 수도 있고(Checkout / Reset / Revert / Reflog), Branch를 분리 / 통합 할 수 도 있다.

다양한 상황에 맞게 대응 하기 위한 기능 활용 및 전략 또한 필요하다.

VCS의 종류

소스 코드 관리를 위한 Version Control에는 다양한 System 혹은 플랫폼이 존재한다.

Local Version Control System(LVCS), 로컬 버전 관리 시스템

로컬 VCS는 개발자의 로컬 컴퓨터에서만 작동하며, 파일의 변경 이력을 로컬 파일 시스템에 저장한다.

초기의 VCS 형태로, 간단하지만 협업에는 한계가 있다.

대표적으로 RCS (Revision Control System) 가 있다.

Centralized Version Control System(CVCS), 중앙집중 버전 관리 시스템

중앙 서버에 모든 파일의 변경 이력을 저장하며, 개발자들이 이 중앙 서버에서 파일을 체크아웃하고 커밋하는 방식이다.

중앙 서버에 의존성이 크다.

동시에 여러명이 소스 반영을 요청할 시 서로의 변화점을 덮어쓰면서 원자성을 위배할 가능성이 있기에 수정 진행 중인 파일은 수정이 불가능하게 File Locking을 걸어준다던가, 먼저 반영이된 변경 사항을 이후에 반영되는 소스코드와 병합하게 Version Merging 을 수행하기위한 추가적인 동작이 필요할 수 있다.

대표적으로 CVS (Concurrent Versions System), Subversion (SVN), Perforce 가 있다.

Distributed Version Control System(DVCS), 분산 버전 관리 시스템

모든 개발자가 로컬에 전체 Repository의 복사본을 가지고 작업하며, 중앙 서버와 독립적으로 작업할 수 있다.

중앙 서버에 문제가 발생하더라도 로컬 Repository에서 복구할 수 있다.

로컬 Repository는 일종의 검문소 역할을 한다고 생각하면된다.

commit을 통해 로컬 Repository에서 소스를 관리하다가 최종적으로 Push를 통해 중앙 서버로 반영하는 과정을 거쳐야한다.

주요 소스 코드와 분리되는 Branch, Trunk와 같이 특수성이 있는 분기를 생성하여 오류를 낮출 수 있다.

대표적으로 Git, Mercurial, Bazaar 가 있다.

Integrated Version Control System(IVCS), 통합 버전 관리 시스템

버전 관리 기능은 물론 빌드, 배포, 모니터링 등 다른 개발 도구와 통합하여 제공하는 시스템이다.

대표적으로 Plastic SCM, ClearCase 가 있다.

VCS의 용어

저장소 및 버전 관련

  • Repository (repo): 소스 코드와 그 변경 이력을 저장하는 장소.
  • Revision: 변경 사항이 반영된 각각의 버전을 의미하며, 커밋할 때마다 하나씩 증가.
  • Baseline: 프로젝트의 기준이 되는 특정 시점의 상태(Revision).
  • Head: 현재 브랜치의 가장 최신 커밋을 가리킴.
  • Tag: 특정 커밋을 가리키는 고정된 이름으로, 주로 릴리스 버전을 표시할 때 사용.

변경 사항 및 반영 관련

  • Commit: 변경된 파일들을 로컬 저장소(DVCS)나 중앙 저장소(CVCS)에 기록하는 행위.
  • Push: DVCS에서 로컬 저장소의 커밋을 원격 저장소에 반영하는 행위.
  • Revert: 특정 커밋의 변경 사항을 되돌리는 새로운 커밋을 만드는 행위.
  • Cherry-pick: 특정 커밋의 변경 사항만을 선택하여 현재 브랜치에 적용하는 행위.

업데이트 및 동기화 관련

  • Update: CVCS에서 로컬 저장소를 최신 버전으로 동기화하는 행위.
  • Pull: 원격 저장소의 변경 사항을 로컬 저장소로 가져오고 병합하는 행위.
  • Fetch: 원격 저장소의 변경 사항을 로컬 저장소로 가져오지만 자동으로 병합하지는 않는 행위.
  • Synchronize: 로컬과 원격 저장소 간의 변경 사항을 동기화하는 행위.

비교 및 병합 관련

  • Change/Diff: 두 버전 간의 변경 사항을 비교하여 차이점을 표시.
  • Compare: 로컬 저장소와 원격 저장소 또는 두 커밋 간의 차이를 비교.
  • Merge: 여러 브랜치의 변경 사항을 하나의 브랜치로 병합하는 행위.
  • Conflict: 병합 시 동일한 파일의 동일한 부분이 서로 다르게 변경되어 충돌이 발생하는 상태.

분기 및 브랜치 관련

  • Branch: 코드의 독립적인 작업 흐름을 만들기 위한 분기.
  • Fork: 다른 사용자의 저장소를 복사하여 독립적으로 개발을 진행하는 행위. 주로 오픈 소스 프로젝트에서 사용.
  • Trunk/Main: 프로젝트의 주요 개발 라인을 가리키며, 보통은 ‘main’ 또는 ‘master’로 명명됨.

기타

  • Checkout: 특정 커밋이나 브랜치의 상태로 워킹 디렉토리를 전환하는 행위.
  • Clone: 원격 저장소의 전체 내용을 복사하여 새로운 로컬 저장소를 생성하는 행위.
  • Export: 버전 관리 정보를 제외하고 파일들을 내보내는 행위.
  • Stash: 현재 작업 내용을 임시로 저장하고 워킹 디렉토리를 깨끗한 상태로 되돌리는 행위.


Ref.

https://support.atlassian.com/bitbucket-cloud/docs/types-of-version-control/

https://en.wikipedia.org/wiki/Version_control