본문 바로가기
  • AI (Artificial Intelligence)
Fundamental/Technical

GIT

by 로샤스 2014. 2. 17.

원본 : ProGIT  Book(http://progit.org)

번역 : 김재훈(이솝 임베디드 포럼, http://www.aesop.or.kr)

 

 

Chapter 1. GIT 가이드를 들어가면서...

 

 

이 챕터는 GIT를 최초로 사용하는 사람들을 위한 기본 지식에 대해 기술 합니다.

우선, 버전 콘트롤 시스템의 개념에 대해 알아본 후, GIT를 우리의 PC에 설정하고 사용하기 위한 방법에 대해 설명하고자 합니다. 또한,  왜 GIT가 현재 차세대 버전관리 시스템으로 각광을 받고 있으며, 그 이유에 대해 알아보고자 합니다.

그리고, 우리가 GIT를 제대로 활용하는 방법을 알려드리기 위해 이 문서를 작성 하였습니다.

 

 

1.1.1. 소스 코드 버전 관리란?

 

우선, 우리는 소스 코드 버전 관리 시스템이 왜 필요한지에 대해 알아둘 필요가 있습니다.

 

소스 코드 버전 관리 시스템이란,  시간에 따라 수정 및 삭제된 파일들의 집합을 기록하는 시스템입니다.

때문에,  과거에 작업했던 특정 버전으로 소스 코드를 손쉽게 복원 및 관리가 가능하게 됩니다.

 

현재 GIT 및 SVN, CVS 등의 버전 관리 시스템은 거의 모든 파일 타입을 버전 관리를 할 수 있지만, 현재 이 문서에서 기술하는 버전 관리의 예를 좀 더 쉽게 설명하기 위해 소프트웨어의 소스 코드를 이용할 것 입니다.

 

1.1.2. 로컬 버전 관리 시스템

 

현재까지 많은 사람들은 관리를 위해, 완성된 소스코드들을 다른 디렉터리에 복사하거나, 날짜별/용도별/버전별로 압축하여 보관하는 방법을 많이 사용 합니다. 이런 방법은 매우 단순하기 때문에 대부분 일반적으로 이런 방법을 선호 합니다.

하지만, 내가 보관한 소스코드들이 어느 디렉터리 또는 어느 파일로 압축이 되었는지 잊기 쉬우며, 우연히 잘못된 디렉터리 또는 파일에 덮어 쓰거나, 삭제하는 경우가 생길 수있습니다.

 

따라서 예전에 개발자들은 이 문제를 해결하기 위해,  버전 관리를 위한 프로그램 소스 코드들을 각 버전 별로 분리해 보관할 수 있는 간단한 구조의 데이터 베이스 체계를 가지는 시스템을 개발했습니다.

이것을 로컬 버전 관리 시스템이라고 합니다. (그림 1-1 참조)

 

18333fig0101-tn.png

 그림 1-1. 로컬 버전 관리 시스템

 

위와 같은 형태의 버전 관리 시스템 중에 가장 유명한 것이 RCS라고 불리는 시스템 입니다.

 

이 RCS 시스템은 현재에도 많은 컴퓨터 시스템에 기본적으로 설치가 되어 있습니다.  

현재 PC 시장에서 많이 채용되고 있는 MacOS 운영체제의 경우, X-Code와 같은 SDK를 설치 했을 경우 이 RCS 시스템을 사용하기 위한 명령어가 포함됩니다.

 

이 RCS 시스템은 기본적으로 디스크 상의 특수 포멧을 소스코드를 저장하며, 이전 버전과 현재 버전의 변경 사항 들에 대한 패치들을 생성하여 이 집합을 보관 및 유지 하는 형태로 소스코드 버전 관리를 수행 합니다.

 

하지만, 이 시스템은 기본적으로 소프트웨어의 버전이 증가할 수록 패치들의 갯수가 누적되게 됩니다.

만약 언젠가 패치들이 너무 과도하게 누적되어 버리면, 관리가 매우 어려워 지며, 소스코드를 이전 버전으로 복원하기 위해 많은 작업이 필요하거나 심지어는 복원이 불가능한 상황까지 올 수가 있습니다.

 

따라서, 리눅스 커널 개발 프로젝트와 같이 하나의 소스코드 집합을 장기간으로 버전관리를 수행하기에는 부적합한 시스템 입니다.

 

1.1.3. 집중 버전 관리 시스템

 

RCS 버전 관리 시스템이 도입된 이후로 개발자들이 겪은 가장 큰 문제는, 다른 사람들과 소스 코드를 공동으로 개발하게 되는 상이 생겼을 경우 대처가 불가능 하다는 점 이었습니다.

 

이를 위해 CVS나 Subversion, Proforce와 같은 집중 버전 관리 시스템(CVCSs)이 개발 되었습니다.

이런 집중 버전 관리 시스템은 단일의 서버를 가지며, 이 서버에 다수의 클라이언트가 접속하여 버전 관리를 필요로 하는 모든 파일들을 서버에서 체크-아웃하는 하는 형식으로 동작 합니다.

 

집중 버전 관리 시스템은 오랜 시간 동안 버전 관리 시스템의 표준이 되어 왔습니다. (그림 1-2 참조)

 

18333fig0102-tn.png

그림1-2. 집중 버전 관리 시스템

 

이 버전 관리 시스템은 이전에 설명한 로컬 버전 관리 시스템에 비해 많은 장점을 제공 합니다.

 

예를 들면, 버전 관리 시스템을 사용하는 모든 개발자들은 해당 프로젝트에서 다른 개발자들이 어떤 작업을 하고 있는지에 대해 개략적으로 알 수 있습니다. 또한, 서버 관리자는 소스 코드 버전 관리를 좀 더 효율적으로 할 수 있습니다.

 

때문에, 하나의 소스 코드 버전 컨트롤 서버를 집중해서 관리하는 것은, 모든 프로젝트 개발자의 데이터 베이스를 각각 관리해야 하는 로컬 버전 관리 시스템 보다 훨씬 유리 합니다.

 

1.1.4. 분산 버전 관리 시스템

 

이제, 여기서 우리가 학습해야 할 분산 버전 관리 시스템(DVCS)에 대해 설명 합니다.

GIT, Mercurial, Bazzar, Darcs 등과 같은 프로그램들이 분산 버전 관리 시스템 입니다.

 

집중 버전 관리 시스템과 분산 버전 관리 시스템이 다른 점은 소스코드의 특정 버전을 체크아웃(Checkout : 버전 관리 시스템으로 부터, 작업 디렉터리에 파일이나 디렉터리를 복사하는 것) 할 때 큰 차이점이 있습니다. 

 

집중 버전 관리 시스템은 내가 작업하고자 하는 파일 또는 프로젝트 버전만 서버에서 받아오지만, 분산 버전 관리 시스템의 경우 리포지터리(Repository : 버전 관리 대상이 되는 파일 및 디렉터리, 갱신 이력을 저장한 데이터베이스)  전체를 클라이언트에 다운로드(미러링) 합니다.  

 

따라서, 버전 관리 시스템의 서버가 장애가 발생했을 경우, 분산 버전 관리 시스템의 경우 클라이언트 측에서 저장한 리포지터리를 서버로 복사하여, 손쉽게 복구 할 수 있습니다. 때로는 서버 대신 어떤 한 클라이언트가 서버의 역할을 대행할 수도 있습니다. 결국 분산 버전 관리 시스템에서 수행하는 체크 아웃 절차의 실제 역할은 모든 데이터를 서버에서 완전히 백업하는 작업 입니다. (그림 1-3을 참조)

 

18333fig0103-tn.png

그림1-3. 분산 버전 관리 시스템의 구조

 

추가적으로, 이와 같은 분산 버전 관리 시스템의 대부분은 작업하고 있는 복수의 리포지터리를 동시에 취급할 수 있기 때문에, 동일한 프로젝트 내에 있는 소스코드의 경우 동시에 다른 방법으로 다른 사람들 혹은 다른 그룹과 공동 작업이 가능 합니다. 따라서, 기존의 집중 버전 관리 시스템에서 불가능 했던 계층적 리포지터리 모델을 구축하거나, 소스코드 관리의 작업 및 체크아웃 절차를 계층적으로 관리할 수 있게 됩니다.

 

예) 리눅스 커널 :

      메인 커널 리포지터리 -> ARM 관련 커널 리포지터리 -> 삼성 커널 리포지터리 로 세개의 계층 구조 일 경우

      1) 삼성 커널 작업 자는 삼성 커널 리포지터리에 수정 코드를 입력 -> ARM 관련 커널 리포지터리로 통합

          -> 메인 커널 리포지터리로 통합

       2) TI 커널 작업자는  -> TI 커널 리포지터리에 수정 코드를 입력 -> ARM 관련 커널 리포지터리로 통합

          -> 메인 커널 리포지터리로 통합

 

 

 

 

출처 : http://blog.daum.net/minzzang0879/73

 

 

 

 

'Fundamental > Technical ' 카테고리의 다른 글

In-Line mode  (1) 2014.04.01
가상화의 형태 - 하이퍼바이저[Hypervisor]  (0) 2014.03.11
하이퍼바이저 - Hypervisor  (0) 2014.03.11
빌드와 빌드도구  (0) 2014.02.17
용어정리  (1) 2014.02.14

댓글