Git이란?
깃(Git)은 컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 스냅샷 스트림 기반의 분산 버전 관리 시스템이다. 또는 이러한 명령어를 가리킨다.
- 위키백과
Git은 대표적인 분산형 버전 관리 시스템(DVCS; Distributed Version Control System)의 일종으로, 파일의 변경사항을 추적하고 기록한다는 특징 때문에 현대 SW개발에서 자주 쓰이는 소프트웨어이다.
VCS이란?
VCS는 Version Control System의 약자로, 직역하면 버전 관리 시스템이다. 예시를 통해 이해해보자.
메모장을 통해 소설을 하나 쓴다고 가정해보자. 초기에 구상했던 내용으로 '버전1.txt'을 완성했다. 하지만, 버전1이 마음에 들지 않아 일부 구절을 삭제하고 다른 구절로 대체하였다. 이를 '버전2.txt'로 저장했다. 다음날 다시 생각해보니, 버전1의 내용이 마음에 들어 버전1의 내용을 유지하고 새로운 구절을 추가하였다. 이를 다시 '버전3.txt'로 저장했다.
앞선 예시처럼 소설을 작성하게 되면, 여러 버전의 소설들을 관리하기 위해서는 수많은 텍스트파일들이 생성되어야 할 것이다. 차라리 하나의 소설 텍스트 파일에서 이 소설에 대한 변화를 기록해서 관리할 수 있다면 얼마나 편할까? 이런 파일들을 관리하기 위한 소프트웨어가 버전 관리 시스템이다. 즉, 컴퓨터를 통해 파일을 수정하고 추가하게 되는데, 이런 변화의 과정을 기록하고 손쉽게 관리할 수 있게 도와주는 시스템을 버전 관리 시스템이라고 한다.
VCS의 종류
VCS의 종류에 대해 알아보기 전에 알아둬야할 용어들이 몇가지 있다.
- Repository는 파일이나 디렉터리 구조의 집합의 변경과정을 담은 데이터인 메타데이터(metadata)를 저장하는 자료구조이다.
- 여기선 '파일을 담고 있는 저장소'정도로 이해하면 된다.
- Checkout은 repository에 특정 버전의 파일을 가져오는 요청을 뜻한다.
- Commit은 repository에 파일의 변경사항을 기록하는 요청을 뜻한다.
Local VCS
Local VCS는 개인 컴퓨터 내에 repository와 파일들을 모두 가지고 있다. patch는 파일들의 변경사항에 대한 정보를 담고 있고, 이 patch들은 repository 안에 담긴다. 만약, N 버전의 파일을 다시 만들면, 버전1의 patch부터 버전 N의 patch의 정보들을 더해가면서 파일을 생성한다. repository와 파일들이 모두 개인 컴퓨터 내부에 있어 협업이 불가능하고, 컴퓨터가 고장나는 등의 문제가 발생하면 파일을 전부 잃을 수 있다.
Local VCS | |
특징 | 개인 컴퓨터(local desktop) 내에 repository와 파일들을 모두 가지고 있다. |
장점 | 개인에 한해서 접근이 용이하다. |
간단한 구조로 이뤄져 있다. | |
단점 | 협업이 불가능하다. |
repository와 파일을 모두 잃을 경우 복구가 불가능하다. | |
예시 | RCS(Revision Control System)의 초기 버전 |
Centralized VCS
소프트웨어 개발 단위가 점점 커짐에 따라 개발자들 사이에 협업(collaboration)이 중요하게 되었다. Centralized VCS는 하나의 중심 서버(central server)에 여러 개의 클라이언트(client)들을 가지는 시스템으로, 협업을 위해 개발됐다. 서버의 repository에는 모든 버전의 파일들이 저장되어 있고, 클라이언트가 commit 시 새로운 버전의 파일이 repository에 축적된다. 클라이언트 별로 commit하기 때문에 버전별로 누가, 어떻게 변경했는지 손쉽게 알 수 있다. 이러한 이유로 CVCS는 오랜 시간동안 버전 관리 시스템의 표준이 되었다.
그럼에도 불구하고, CVCS에 몇 가지 단점이 있다. 하나의 서버에 모든 파일들이 저장되기 때문에 서버에 문제가 발생할 경우 개발이 완전히 중단된다. 게다가 서버의 파일이 손상되기라도 하면 복구가 불가능하다. 또한, 어떤 개발자가 자신의 소스파일을 저장하기 위해 commit했을 때, 그 소스파일의 코드가 아직 안정되지 않은(unstable) 상태라면 다른 개발자는 곤경에 빠진다. 이 개발자는 해당 개발자가 코드를 안정화시킬 때까지 기다리거나 자신이 그 코드를 수정해야 한다. 이러한 과정에서 개발시간이 지연될 수 있다.
Centralized VCS | |
특징 | 하나의 중심 서버(centralized server)가 repository를 가지고, 여러 클라이언트(client)들이 서버에 접속한다. |
장점 | 파일들을 다른 클라이언트들과 실시간으로 공유할 수 있다. 즉, 협업이 가능하다. |
누가 어떻게 버전을 추가/변경했는지 추적할 수 있다. | |
단점 | 서버에 문제가 생길 경우 완전히 중단된다. 심하면 파일을 잃을 수 있다. |
안정된(stable) 버전 관리를 위해서 개발시간이 지연될 수 있다. | |
예시 | SVN(SubVersioN) |
Distributed VCS
Distributed VCS는 Centralized VCS의 단점을 보완해 개발됐다. DVCS는 클라이언트와 서버 모두 각자의 repository를 가지고 있다. 이들은 push/fetch 명령어를 통해 서로의 repository를 복제(clone)한다. CVCS와 달리 클라이언트에도 repository가 있기 때문에 서버에 문제가 생겨도 작업을 이어갈 수 있고, 클라이언트별로 버전 관리도 가능하다. 이는 프로젝트를 세부적으로 분업화 수 있고, 개발과정을 더 쉽게 추적 및 관리할 수 있게 한다. 이런 점들로 인해 DVCS는 VCS모델들 중 현재 가장 많이 쓰이고 있다.
단점이 없어보이겠지만, DVCS에도 단점은 있다. 클라이언트들은 자신만의 repository를 유지해야 하기 때문에 CVCS에 비해 데이터 공간을 더 많이 사용해야 한다. 또, 규모가 큰 프로젝트의 경우 서버의 repository에서 복제하는 시간이 오래 걸릴 수도 있다.
Distributed VCS | |
특징 | 서버와 클라이언트들 모두 각자의 repository를 가지며, 서로의 repository를 복제(clone)한다. |
장점 | 서버에 문제가 생겨도 작업을 이어갈 수 있다. |
프로젝트를 분업화할 수 있고, 개발과정을 더 쉽게 추적 및 관리할 수 있다. | |
단점 | 클라이언트에게 더 많은 데이터 공간을 요구한다. |
큰 규묘의 프로젝트의 repository를 복제할 경우 시간이 오래 걸릴 수 있다. | |
예시 | Git, Mercurial |
Git의 등장 배경
Git은 Linux의 개발과정에서 탄생했다. Linux는 대표적인 오픈소스 운영체제로, Linus Tovalds에 의해 개발이 시작되었다. Linus Tovalds가 MINIX를 이용해 심심풀이('just a hobby')로 만들어진 운영체제이었지만, 많은 개발자들이 Linux의 개발에 참여하길 원하면서 프로젝트의 규모가 점점 커지기 시작했다.
Linux 커널 프로젝트는 초기에 BitKeeper라는 DVCS로 관리되었다. 하지만, BitKeeper의 정책 변경으로 유료화되면서 새로운 버전 관리 시스템이 필요해졌다. 이에 Linus Tovalds는 빠르고, 간단하면서 대규모 프로젝트를 적합한 DVCS인 Git을 만들어냈다. Git을 통한 Linux 커널 프로젝트 관리는 성공적이었고, 현재까지 Github에서 가장 큰 규모의 프로젝트로 남아있다.