Git
Git 역사
2002년에 드디어 Linux 커널은 BitKeeper라고 불리는 상용 DVCS를 사용하기 시작했다. 2005년에 커뮤니티가 만드는 Linux 커널과 이익을 추구하는 회사가 개발한 BitKeeper의 관계는 틀어졌다. BitKeeper의 무료 사용이 제고된 것이다. 이 사건은 Linux 개발 커뮤니티(특히 Linux 창시자 Linus Torvalds)가 자체 도구를 만드는 계기가 됐다. Git은 BitKeeper를 사용하면서 배운 교훈을 기초로 아래와 같은 목표를 세웠다.
- 빠른 속도
- 단순한 구조
- 비선형적인 개발(수천 개의 동시 다발적인 브랜치)
- 완벽한 분산
- Linux 커널 같은 대형 프로젝트에도 유용할 것(속도나 데이터 크기 면에서)
버전 관리란?
중앙집중식 버전 관리(CVCS)
CVS, SubVersion, Perforce 같은 시스템은 파일을 관리하는 서버가 별도로 있고, 클라이언트가 중앙 서버에서 파일을 받아서 사용(Checkout)한다.
- 대표적인 문제는 서버가 다운되면 다름사람과 협업
- 하드디스크가 문제가 생기면 프로젝트의 모든 히스토리를 잃는다.
분산 버전 관리 시스템(DVCS)
Git, Mecurial, Bazaar, Darcs 같은 DVCS에서의 클라이언트는 단순히 파일의 마지막 스냅샷을 Checkout 하지 않는다. 즉, 클라이언트가 중앙 서버에서 파일을 받아서 사용하지 않고, 그냥 저장소를 전부 복제한다. 서버에 문제가 생기면 이 복제물을 다시 작업을 시작할 수 있다. 저장소가 클라이언트로 복사되기 때문에 클라이언트 중에서 아무거나 골라도 서버를 복원할 수 있다.
대부분 DVCS 환경에서는 리모트 저장소가 존재한다. 리모트 저장소가 많을 수 있다.
리모트 저장소란?
리모트 저장소를 관리할 줄 알아야 다른 사람과 함께 일할 수 있다. 리모트 저장소는 인터넷이나 네트워크 어딘가에 있는 저장소를 말한다. 저장소는 여러 개가 있을 수 있는데 어떤 저장소는 읽고 쓰기 모두 할 수 있고 어떤 저장소는 읽기 권한만 있을 수도 있다. 간단히 말해서 다른 사람들과 함께 일한다는 것은 리모트 저장소를 관리하면서 데이터를 거기에 Push하고 Pull하는 것이다.
Subversion과 Git의 가장 큰 차이점은? 데이터를 다루는 방법에 있다. CVS, Subversion, Perforce, Bazaar 등의 시스템은 각 파일의 변화를 시간순으로 관리하면서 파일들의 집합을 관리한다.
Git은 위와 같이 데이터를 저장하지도 않고 취급하지도 않는다. 데이터를 파일 시스템 스냅샷으로 취급하고 크기가 아주 작다(?)
Git은 커밋하거나 프로젝트의 상태를 저장할 때마다 파일이 존재하는 그 순간을 중요하게 여긴다.
파일이 달라지지 않았으면, Git은 성능을 위해서 파일을 새로 저장하지 않는다.
단지 이전 상태의 파일에 대한 링크만 저장한다. Git은 데이터를 스냅샷의 스트림처럼 취급한다.
Git 세가지 상태?
Git 파일은 Committed, Modified, Staged 이렇게 세가지 상태로 구분된다.
- Committed : 데이터가 로컬 데이터베이스에 안전하게 저장됐다는 것을 뜻한다.
- Modified : 수정한 파일을 아직 로컬 데이터베이스에 커밋하지 않은 것을 말한다.
- Staged : 현재, 수정한 파일을 곧 커밋할 거라고 표시한 상태를 의미한다.
Git 디렉토리, 워킹 디렉토리, Staging Area 는 세가지 상태랑 연결
- Git 디렉토리: Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳을 말한다. 다른 컴퓨터에 있는 저장소를 Clone 할 때 Git 디렉토리가 만들어진다.
- 워킹 디렉토리: 프로젝트의 특정 버전을 Checkout 한 것이다.
- Staging Area: Git 디렉토리에 있다. 단순한 파일이고 곧 커밋할 파일에 대한 정보를 저장한다.
Git으로 하는 일은?
- 워킹 디렉토리에서 파일을 수정한다.
- Staging Area에 파일을 Stage 해서 커밋할 스냅샷을 만든다.
- Staging Area에 있는 파일들을 커밋해서 Git 디렉토리에 영구적인 스냅샷으로 저장한다.