{{위키데이터 속성 추적}}
{{출처 필요|날짜=2018-03-15}}

'''버전 관리'''({{llang|en|version control, revision control}}) 또는 '''소스 관리'''({{llang|en|source control}})<ref name=Mercurial>{{서적 인용|last1=O'Sullivan|first1=Bryan|title=Mercurial: the Definitive Guide|date=2009|publisher=O'Reilly Media, Inc.|location=Sebastopol|isbn=9780596555474|url=http://hgbook.red-bean.com/read/|accessdate=4 September 2015}}</ref> 혹은 '''소스 코드 관리'''({{llang|en|source code management}})는 동일한 정보에 대한 여러 버전을 관리하는 것을 말하는데 [[공학]]과 [[소프트웨어 개발]]에서 팀 단위로 개발 중인 [[소스 코드]]나, [[청사진]] 같은 [[설계도]] 등의 [[디지털 문서]]를 관리하는데 사용된다. 그러한 문서의 변경 사항들에 숫자나 문자로 이뤄진 ("개정판 번호"나 "개정판 레벨"이라고도 불리는) "[[버전]]"을 부여해서 구분한다. "버전"을 통해서 시간적으로 변경 사항과 그 변경 사항을 작성한 작업자를 추적할 수 있다. 간단한 버전 관리 방법으로는 처음 작성한 코드에 버전 번호 1을 부여한다. 변경 사항이 생기면, 버전 번호를 2로 증가시킨다. 이처럼 추후 변경 사항이 발생 시마다 버전 번호를 1씩 증가시킨다.

[[소프트웨어 공학|소프트웨어 엔지니어링]]에서는 일반적인 소프트웨어의 소스 코드 내역을 관리하는 것을 주로 버전 관리라고 정의하게 된다. 일반적으로 산업 공학이나 이전 생산 기반 제조 공학 등에서 소프트웨어 쪽으로 넘어오는 학문적 관심에 의해 이전 생산 공학에서 사용하던 개념을 가져오게 되었고, 그에 따라 버전 관리(Software Version Management)와 [[소프트웨어 구성 관리|형상 관리]](Software Configuration Management)의 개념들이 따라왔다고 볼 수 있다.

한국의 경우, 대부분의 서적들이 [[일본어]]를 거쳐 중역(重譯)되면서 오역된 경우가 많고 관련된 분야에 대해 정확하거나 깊은 이해 없이 단순 소개하며 넘어간 경우가 대부분이라 아직도 정확한 버전 관리와 [[형상 관리]]의 구분이나 이해가 없다고 보는 것이 맞다.

버전 관리 소프트웨어 도구들은 거의 모든 소프트웨어 개발 프로젝트에서 필수적인 요소로 인식되고 있다.

==버전 관리 일반 ==
=== 버전 관리를 이용해야하는 까닭 ===
거의 대부분의 주요 소프트웨어 개발 프로젝트는 아직도 소프트웨어의 설계도라 할 수 있는 소스 코드 작성이 주요한 부분이 되며 이러한 소스 코드는 기업체 또는 연구소의 핵심 역량이 응축된 핵심 자산이다. 따라서 어떤 형태로든 소스 코드를 백업하여 분실의 위험에서 보호하고 개정 전후 내용을 파악하여 추후 발생할지도 모를 오류 수정에 대비하는 절차가 필요하다.
버전 관리 소프트웨어는 조직의 핵심 자산인 소스 코드의 개정과 백업 절차를 자동화하여 오류 수정 과정을 도와줄 수 있는 시스템으로 이미 다수의 국제 협력 개방 소프트웨어 개발 실무에서도 널리 사용되고 있다.
다음은 버전 관리 시스템을 사용하는 원인을 정리한 것이다.
* 무언가 잘못되었을 때 복구를 돕기 위하여
* 프로젝트 진행 중 과거의 어떤 시점으로 돌아갈 수 있게 하기 위하여
* 여러사람이 같은 프로젝트에 참여할 경우, 각자가 수정한 부분을 팀원 전체가 동기화하는 과정을 자동화하기 위하여
* 소스 코드의 변경 사항을 추적하기 위하여
* 소스 코드에서 누가 수정했는지 추적하기 위하여
* 대규모 수정 작업을 더욱 안전하게 진행하기 위하여
* 가지내기(Branch)로 프로젝트에 영향을 최소화 하면서 새로운 부분을 개발하기 위하여
* 접붙이기(Merge)로 검증이 끝난 후 새로이 개발된 부분을 본류(trunk)에 합치기 위하여
* 많은 오픈 소스 프로젝트에서 어떠한 형태로든 버전 관리를 사용하고 있으므로
* 코드의 특정 부분이 왜 그렇게 쓰여 졌는지 의미를 추적하기 위하여

=== 일반적으로 버전 관리 소프트웨어가 사용되는 방식 ===
* 갑돌이가 어떤 파일을 저장소(repository)에 추가(add)한다.
* 추가되었던 파일을 갑돌이가 인출(Check out) 한다.
* 갑돌이가 인출된 파일을 수정한 다음, 저장소에 예치(Commit) 하면서 설명을 붙인다.
* 다음날 을순이가 자신의 작업 공간을 동기화(Update) 한다. 이때 갑돌이가 추가했던 파일이 전달된다.
* 을순이가 추가된 파일의 수정 기록(Change log)을 보면서 갑돌이가 처음 추가한 파일과 이후 변경된 파일의 차이를 본다(Diff).

=== 버전 관리에서 흔히 사용되는 개념 및 용어 ===
* Repository 저장소, Server, Client, Working Copy 작업 copy, Trunk / Main 주류 / 본류
* Add 추가, Revision 개정판, Head 최신, Check out 인출, Check in / Commit 반납 / 예치, Check in message, Change log / History 수정 기록, Update / Sync 동기화, Revert
* Branch 가지내기, Diff 차이보기, Merge 합치기/접붙이기/접목하기, Conflict 충돌, Resolve 해소, Locking 잠그기
* 체크 아웃(Check Out) : 저장소(Repository)에서 파일을 가져온다.
* 체크 인(Check In, Commit) : 체크 아웃(Check Out)한 파일의 수정이 끝난 경우 저장소(Repository)에 새로운 버전으로 갱신 하는 일이다. 이때 이전에 갱신된 것이 있는 경우 충돌(conflict)을 알려 주며 diff 도구를 이용해 수정하고 commit하는 과정을 거치게 된다.
* 가져오기(Import) : (버전 관리되고 있지 않은) 로컬 디렉토리의 파일을 처음으로 저장소(Repository)에 복사한다.
* 저장소(Repository) : 파일의 현재 버전과 변경 이력 정보를 저장하는 저장소.

== 같이 보기 ==
* [[구성 관리]]
* [[소스 코드 제어 시스템]]
* [[버전 관리 시스템|RCS]]
* [[체인지로그]]
* [[서브버전|Subversion]]
* [[머큐리얼|Mercurial]]
* [[퍼포스 헬릭스]]
* [[깃 (소프트웨어)]]

== 각주 ==
{{각주}}

{{버전 관리 소프트웨어}}

{{전거 통제}}

[[분류:버전 관리| ]]
[[분류:버전 관리 시스템]]
[[분류:소프트웨어 공학]]
[[분류:기술 소통]]
[[분류:소프트웨어 개발 프로세스]]
[[분류:분산 버전 관리 시스템]]