본문 바로가기

DevOps/#Continuous Integration

[VCS] Git의 작동 원리와 사용법 (1) (Pro Git 2/E)

목차

1. 시작하기

로컬 버전 관리

디렉터리로 파일을 복사해서 버전을 관리하는 방법으로, 간단하지만 디렉터리를 삭제하거나, 디렉터리를 잘못 복사하는 등 오류가 발생할 수 있다. 이에 따라, VCS는 간단한 데이터베이스를 사용해 파일의 변경 정보를 관리한다.

많이 쓰는 VCS 도구 중 RCS(Revision Control System)이 있다. 이는 Mac OS X 운영 체제에서도 개발도구와 함께 설치되며, 기본적으로 Patch Set(파일에서 변경되는 부분)을 관리한다. 이 Patch Set은 특별한 형식의 파일로 저장되며, 일련의 Patch Set을 적용해서 모든 파일을 특정 시점으로 원복할 수 있다.

 

중앙집중식 버전관리 (CVCS)

다른 개발자와 함께 작업해야 할 때, CVS, Subversion(SVN), Perforce 같은 CVCS(중앙집중식 VCS)를 사용할 수 있다. 이는 파일을 관리하는 서버가 별도로 있고(중앙에), 클라이언트는 이 중앙 서버에서 파일을 받아 사용한다. (Checkout)

이러한 방식은 모든 사용자의 활동을 추적할 수 있고, 모든 클라이언트의 로컬 DB를 관리하는 것보다 효율적이다. 하지만, 이 중앙 서버에 문제가 생기면 모든 작업자들이 협업/백업 등의 기능을 사용할 수 없고, 중앙 DB의 하드디스크에 문제가 생기면 모든 히스토리가 유실될 수 있다. (개인이 갖는 스냅샷만 남음)

 

분산 버전관리 시스템 (DVCS)

Git, Mercurial, Bazaar, Darcs 등의 DVCS에서 클라이언트는 파일의 마지막 스냅샷을 Check out 하는 방식이 아닌, 저장소 전부를 복제한다. 이로써 서버에 문제가 생기면 이 복제물로 다시 작업을 복원할 수 있다.

또한, 대부분의 DVCS 환경은 리모트(원격) 저장소를 가지며, 이를 통해 개발자는 동시에 다양한 그룹과 다양한 방법으로 협업할 수 있다. 계층 모델을 갖는 중앙집중식 시스템으로는 불가능한 워크플로우도 사용할 수 있다.

 

Git의 기초
  • 차이가 아닌 스냅샷

대부분의 VCS와 Git의 가장 큰 차이점은 데이터를 다루는 방식이다. CVS, SVN, Perforce, Bazaar 같은 대부분의 VCS는 파일들의 목록과 각 파일의 변화를 시간 순으로 관리하며, 파일들의 집합을 관리한다.

한편, Git은 데이터를 파일 시스템의 스냅샷으로 취급하고, 매우 작은 크기로 관리한다. 또한, Git은 커밋하거나, 상태값이 바뀔 때마다 파일이 존재하는 순간을 중요하게 여겨, 파일의 변경이 없으면 별도의 파일을 생성하지 않고, 이전 상태의 파일에 대한 링크만 저장한다. 즉, Git은 데이터를 스냅샷의 스트림처럼 취급한다.

  • 거의 모든 명령을 로컬에서 실행

Git은 로컬 파일과 데이터를 사용하여 명령을 처리하기 때문에 네트워크가 연결된 다른 PC가 필요하지 않다. 대부분의 CVCS는 네트워크 속도에 명령 처리 속도가 영향을 받는데, Git을 사용하는 클라이언트는 프로젝트의 모든 히스토리를 로컬 디스크에 저장하므로, 모든 명령을 거의 순식간에 처리할 수 있다. (히스토리를 조회하거나, 버전 간 비교할 때에도 리모트에 있는 서버에 접근할 필요 없이 로컬 DB에서 조회 후 리포트 함)

뿐만 아니라, 오프라인 상태이거나, VPN(Virtual Private Network)에 연결된 상태가 아니어도, 커밋할 수 있다. Perforce, SVN 등 다른 CVS에서는 네트워크 접속이 안 된 상황에서 파일 변경만 가능하고, 변경사항을 반영할 수 없다.

  • Git의 무결성

Git은 데이터를 저장하기 전에 SHA-1 해쉬 기반의 체크섬(Git의 가장 기본단위)을 구하고, 이를 기반으로 데이터를 관리한다. 즉, 체크섬 없이는 어떠한 파일이나 디렉터리도 변경할 수 없다.

체크섬은 40자 길이의 16진수 문자열로, 파일 내용이나 디렉터리 구조를 이용하여 구할 수 있다. Git은 모든 것을 해시로 식별하며, 파일도 이름으로 저장하는 것이 아닌 해시로 저장한다.

  • 세 가지 상태

Git은 Committed, Modified, Staged의 세 가지 상태를 관리한다. 먼저, Committed란 데이터가 로컬 DB에 안전하게 저장되었다는 것을 의미하며, Modified는 수정한 파일을 로컬 DB에 Commit하지 않은 상태이다. 마지막으로, Staged는 수정한 파일을 커밋하기 전 영구적으로 반영할 스냅샷을 만들며 준비하는 상태이다. 

이 세 가지 상태 값은 Git 프로젝트의 세 가지 단계와 연결되어 있다. 각각 Git 디렉터리, 워킹 디렉터리, Staging Area이며, Git 디렉터리는 Git이 메타데이터와 객체 DB를 저장하는 Git의 핵심 공간이다. 다른 컴퓨터에 있는 저장소를 Clone할 때 Git 디렉터리가 만들어진다.

다음으로, 워킹 디렉터리는 프로젝트의 특정 버전을 Checkout한 것이다. Git 디렉터리는 지금 작업하고 있는 디스트에 있고, 그 디렉터리 안에 압축된 DB에서 파일을 가져와 워킹 디렉터리를 만든다. Staging Area는 Git 디렉터리에 있는 단순한 파일이며, 인덱스라고도 불린다.




Data Science / DevOps TIL-log

학부생 때는 Data Science 공부하다가, 회사에서는 (어쩌다보니) DevOps를 하고 있는 사람의 TIL 블로그입니다. 게시글이 도움 되셨다면 구독과 좋아요 b + :)