본문 바로가기
etc

VCS(Version Control System) - Subversion(svn), Git 특징 및 용어 정리

by 돈코츠라멘 2019. 8. 30.

Version Control ?

  • 파일의 변화를 시간에 따라 기록하여 과거 특정 시점의 버전을 다시 불러올 수 있다.
  • 여러 사람이 수정한 소스코드의 병합(merge) 검증이 끝난 후 메인 코드에 통합할 수 있다.
  • 개별 파일 도는 프로젝트 전체를 이전 상태로 되돌릴 수 있어서 문제가 생겨도 쉽게 복구할 수 있다.
  • 소스코드의 변경 사항을 쉽게 추적할 수 있다.

Subversion (SVN)

중앙 집중식 버전 관리 시스템으로 가장 많이 사용되던 버전 관리 도구 중 하나였다. 디렉터리를 Trunk/Branches/Tags로 구분하여 프로젝트에 영향을 최소화하며 변경할 수 있다.

  • Trunk: 주요 개발 영역이다.
  • Branches: Release 버전과 유지보수 버전을 분리하고 싶을 때 주로 사용한다. branch에서 수정하다가 trunk로 병합하는 것이 일반적이다.
  • Tags: 현재 release 된 버전을 따로 보관하기 위해 사용한다. 개발을 위한 것이 아니라 '보관'만을 위한 것이기 때문에 export만 가능하다. (= snapshots)checkout : 소스를 클라이언트에 내려 받는 작업
  • update : 현재 버전 이후에 변경된 소스가 있으면 최신 소스로 갱신
  • commit : 소스 변경 후 반영
  • merge : 작업한 소스가 최신 소스와 충돌할 경우 합치는 작업

단, 중앙 집중식 버전 관리 시스템은 중앙 서버에 문제가 생기면 복구될 때까지 협업과 버전 관리가 불가능하다. 또한 각 클라이언트는 스냅샷만 보관하고 있으므로 서버를 복구하지 못할 경우 그동안 쌓인 이력을 모두 잃을 수도 있다. 이런 문제를 해결하기 위해 분산 버전 관리 시스템이 등장하였다.


Git

가장 대표적인 분산 버전 관리 시스템이다. 분산 버전 관리 시스템은 클라이언트가 파일들의 마지막 스냅샷을 가져오는 게 아니라 레파지토리를 통째로 복사해서 가지고 있다. 즉 checkout 할 때마다 레파지토리가 복사된다.

  • Add : staging area에 파일 추가
  • commit : 소스 변경 후 반영 (local)
  • pull : 서버에 현재 버전 이후에 변경된 소스가 있으면 최신 소스로 갱신
  • push : local 변경 사항 서버에 보내기
  • Checkout : 서버의 소스를 local 클라이언트에 내려 받음, branch 이동

Staging Area

변경사항이 레파지토리에 저장되기 전에 거쳐야 하는 git에서만 존재하는 중간 공간이다.

  • working directory의 모든 파일은 크게 Tracked(관리대상임)와 Untracked(관리대상이 아님)로 나눈다. Tracked 파일은 이미 스냅샷에 포함돼 있던 파일이다.
  • Tracked 파일은 또 unmodified(수정하지 않음)와 modified(수정함) 그리고 staged(commit으로 repository에 기록할) 상태 중 하나이다.

마지막 커밋 이후 아직 아무것도 수정하지 않은 상태에서 어떤 파일을 수정하면 Git은 그 파일을 modified 상태로 인식한다. 실제로 commit 하기 위해서는 이 수정한 파일을 staged 상태로 만들고, staged 상태의 파일을 commit 한다.
수정한 코드 일부분만 commit 할 때, 충돌을 해결할 때 등에 유용하다.

Branch

동일한 소스코드를 기반으로 다른 작업을 진행하고 싶을 때 branch를 분리해서 사용한다. 일종의 개발 라인이다. 이 분리된 branch는 원래의 버전과 비교한 후 하나의 branch로 다시 합칠 수도 있다.

master branch

가장 메인이 되는 branch로 처음 레파지토리를 만들면 git은 master branch를 만든다. 이후 develop branch 등 새로운 branch를 만들어서 작업해나간다.

gitflow

git을 사용해서 작업을 처리하는 방법들을 work flow라고 한다. 당연히 여러 가지 형태가 있지만, 그중 폭넓게 사용되고 있는 방법은 gitflow다.

댓글