버전관리
파일의 변화를 시간에 따라 기록하고 특정 시점의 버전을 복원할 수 있는 도구입니다.
소프트웨어 개발뿐만 아니라 디자인 작업 등 다양한 분야에서 유용하게 사용됩니다.
장점
- 이전 상태로의 복원이 가능합니다.
- 변경 내역을 비교하고 추적할 수 있습니다.
- 문제 발생 시 원인을 쉽게 파악할 수 있습니다.
- 실수로 인한 손실을 방지하고 복구할 수 있습니다.
로컬 버전 관리
많은 사람들은 파일을 복사하여 별도의 디렉토리에 저장하는 방식으로 버전을 관리합니다.
이는 간단하지만 실수로 인한 문제가 발생하기 쉽습니다.
디렉토리 저장 방식으로 버전 관리 시 발생하는 문제 예시
- 작업 디렉토리를 실수로 삭제할 수 있습니다.
- 파일을 잘못 수정하거나 복사할 수 있습니다.

중앙집중식 버전 관리(CVCS)
프로젝트에서 여러 개발자와의 협업이 필요할 때 중앙집중식 버전 관리 시스템(CVCS)이 사용됩니다.
특징
- 중앙 서버에서 파일을 관리하고, 클라이언트가 이를 받아 사용합니다.
- 팀원들의 작업 현황을 쉽게 파악할 수 있습니다.
- 관리자가 작업을 효율적으로 통제할 수 있습니다.
- 여러 로컬 데이터베이스 대신 하나의 중앙 시스템만 관리하면 됩니다.
단점
- 중앙 서버에 문제가 생기면 협업과 백업이 불가능해집니다.
- 중앙 데이터베이스에 손상이 생기면 프로젝트 전체 히스토리를 잃을 수 있습니다.

분산 버전 관리 시스템
특징
- 클라이언트가 저장소의 전체 히스토리를 복제합니다.
- 서버에 문제가 생겨도 복제된 저장소로 작업을 계속할 수 있습니다.
- 모든 클라이언트가 완전한 백업 역할을 할 수 있습니다.
- 여러 개의 원격 저장소를 활용할 수 있습니다.
장점
- 다양한 그룹과 동시에 협업할 수 있습니다.
- 유연한 워크플로를 구성할 수 있습니다.
- 중앙집중식 시스템보다 더 다양한 작업 방식을 지원합니다.

스냅샷
- Git은 데이터를 파일 시스템 스냅샷의 연속으로 취급합니다.
- 크기가 아주 작고, 커밋하거나 프로젝트의 상태를 저장할 때마다 파일이 존재하는 그 순간을 중요하게 여깁니다.
- 파일이 달라지지 않았으면 성능을 위해 이전 상태의 파일에 대한 링크만 저장합니다.
- 즉, 데이터를 스냅샷의 스트림처럼 취급합니다

로컬에서 명령 실행
- Git은 로컬 파일과 데이터만 사용하기 때문에 네트워크 연결이 필요 없습니다.
- 프로젝트의 모든 히스토리가 로컬 디스크에 있어 모든 명령이 매우 빠르게 실행됩니다.
- 서버 없이 로컬 데이터베이스에서 히스토리를 조회하고 파일 버전을 비교할 수 있습니다.
- 네트워크 상태와 상관없이 작업을 할 수 있습니다.
- 오프라인 상태에서도 커밋이 가능해, 다른 VCS 시스템과 비교해 큰 장점을 제공합니다.
무결성
- Git은 데이터를 저장하기 전에 체크섬을 구하고, 이를 통해 데이터를 관리합니다.
- 체크섬을 이해하는 Git 없이는 파일이나 디렉토리를 변경할 수 없습니다.
- 체크섬은 가장 기본적인 데이터 단위이자 Git의 기본 철학입니다.
- SHA-1 해시를 사용하여 체크섬을 만들고, 이를 통해 파일의 내용이나 디렉토리 구조를 식별합니다.
-
24b9da6552252987aa493b52f8696cd6d3b00373
-
- 파일을 이름이 아닌 해시로 저장합니다.
데이터 추가 및 복구
- 데이터를 추가할 뿐, 삭제하거나 되돌릴 방법이 없습니다
- 데이터베이스에 데이터가 추가되며, 커밋하지 않으면 변경사항을 잃을 수 있습니다.
- 스냅샷을 커밋하면 데이터를 잃기 어렵습니다.
- 프로젝트를 안전하게 실험할 수 있고, 되돌리기를 통해 데이터 저장 및 복구 방법 이해가 가능합니다.
세 가지 상태와 단계

- Git은 아래 세 가지 상태로 관리합니다.
- Committed: 데이터가 로컬 데이터베이스에 안전하게 저장된 상태입니다.
- Modified: 수정된 파일이 아직 로컬 데이터베이스에 커밋되지 않은 상태입니다.
- Staged: 수정된 파일을 곧 커밋할 것이라고 표시한 상태입니다.
- 위 세 가지 상태는 Git 프로젝트의 세 가지 단계와 연결됩니다.
- Git 디렉토리: Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳입니다. 다른 컴퓨터에서 저장소를 Clone 할 때 이 디렉토리가 만들어집니다.
- 워킹 트리: 프로젝트의 특정 버전을 Checkout한 것입니다. Git 디렉토리에서 파일을 가져와서 워킹 트리를 만듭니다.
- Staging Area: Git 디렉토리에 있으며, 곧 커밋할 파일에 대한 정보를 저장하는 단순한 파일입니다. "Index"라고도 합니다.
- Git으로 하는 기본 작업:
- 워킹 트리에서 파일을 수정합니다.
- 수정한 파일을 Staging Area에 Stage 해서 커밋할 스냅샷을 만듭니다.
- Staging Area에 있는 파일들을 커밋해서 Git 디렉토리에 영구적인 스냅샷으로 저장합니다.
- 파일의 상태에 따른 관리:
- Git 디렉토리에 있는 파일들은 Committed 상태입니다.
- 파일을 수정하고 Staging Area에 추가하면 Staged 상태입니다.
- Checkout 후 수정했지만 Staging Area에 추가하지 않으면 Modified 상태입니다.