Git의 버전관리
Git은 분산 버전 관리 시스템(이하 DVCS)으로, 각 클라이언트가 전체 저장소의 복사본을 소유한다. 이는 중앙 서버에 대한 의존성을 줄이고, 네트워크 연결이 불안정한 상황에서도 작업을 지속할 수 있게 한다. 모든 커밋은 sha-1을 통한 Hash를 가지며, 저장하기 전 checksum을 통해 검사하므로 데이터의 무결성을 보장한다.
DVCS에서는 클라이언트가 단순히 최신 파일을 체크아웃하는 것이 아니라 전체 저장소를 복제한다. 따라서 과거 버전으로 돌아갈 때 Git은 서버할 필요 없이 로컬 데이터베이스에서 직접 읽어온다. 또한 대부분의 Git 작업은 로컬 파일과 리소스만으로도 수행할 수 있어, 네트워크상의 다른 컴퓨터로부터 정보를 받을 필요가 없다. 따라서 깃의 동작은 매우 빠르다.
Git의 데이터 저장 방법
Git은 데이터를 작은 파일 시스템의 연속된 스냅샷으로 다룬다. 스냅샷이란 사진을 찍으면 그 순간이 저장되듯이 특정 시점의 시스템 상태나 데이터 상태를 그대로 복사하여 저장하는 것이다. Git은 로컬에서 커밋을 할때마다 Git은 모든 파일의 현재 모습을 사진 찍듯이 기록하고 그 스냅샷에 대한 참조를 저장한다. 따라서 Git은 스냅샷 기반의 버전 관리 시스템으로, 각 파일의 변경 사항을 스냅샷 형태로 저장한다. 그림3을 보면 이에 대해 더 잘 이해할 수 있다. 그림3과 그림2의 차이는 그림3은 파일의 변경사항이 시간축과 수직이다. 그러나 그림2는 시간이 지남에 따라 차이를 계산하여 저장하는 것을 볼 수 있다. 따라서 파일의 변경사항이 시간축과 수평하다. 그러나 스냅샷을 찍는다해서 모든 파일들을 그대로 저장하는 것이 아니다. Git은 저장 효율을 높이기 위해 변경된 파일만 저장하고 동일한 파일은 참조를 통해 관리한다.
데이터를 이렇게 저장함으로써 얻는 장점은 git branch에서 알 수 있다.Git에서 git commit 명령어를 실행하면, Git은 하위 폴더들을 checksum(SHA-1)하여 Git 저장소에 tree 객체로 저장한다. tree 객체는 blob 객체를 가르키고 blob 객체는 버전에 따른 파일들이다. 그런 다음, Git은 tree 객체를 가르키는 commit 객체를 생성하여 필요 시 해당 스냅샷을 재구성할 수 있게 한다. 따라서 Git에서 브랜치는 커밋을 가리키는 포인터이다.
이때 main branch가 있는 상태에서 새로운 브랜치를 만들면 새로운 포인터가 생성된다. Git은 HEAD라는 포인터를 이용하여 현재 어느 브랜치에 있는지 확인한다. 브랜치를 전환할 때 git checkout 명령어를 실행하여 봤을 것이다. 그러면 HEAD는 checkout된 브랜치를 가리키게 된다. 그 상태에서 commit을 하면 새로운 브랜치는 앞으로 이동하지만, main 브랜치는 git checkout으로 브랜치를 전환했을 때의 commit을 여전히 가리키고 있다.
Git의 동작
Git에는 파일이 존재할 수 있는 세 가지 주요 상태가 있다
- modifed은 파일을 변경했지만 로 데이터베이스에 커밋하지 않은 상태를 의미한다.
- staged은 현재 버전의 수정된 파일을 다음 커밋 스냅샷에 포함되도록 표시한 상태를 의미한다.
- commited은 데이터가 로컬 데이터베이스에 안전하게 저장된 상태를 의미한다.
이로 인해 Git 프로젝트는 세 가지 주요 섹션으로 나뉜다
- Working Directory는 프로젝트의 한 버전을 체크아웃한 것이다. 이러한 파일들은 Git 디렉토리의 압축된 데이터베이스에서 꺼내어 디스크에 배치되어 사용하거나 수정할 수 있게 된다.
- Staging Area은 다음 커밋에 포함될 정보를 저장하는 파일로, 일반적으로 Git 디렉토리에 포함된다. Git에서는 이를 iindex라고 부르지만, "스테이징 영역"이라는 표현도 사용된다.
- Git directory는 프로젝트의 메타데이터와 객체를 저장하는 곳이다. 이것이 다른 컴퓨터에서 저장소를 클론할 때 복사되는 것이다.
따라서 우리가 add 명령어를 사용하면 staging area에 진입하고, 그 상태에서 commit을 하면 git directory에 진입하고, git directory는 로컬 데이터베이스이므로 push를 하면 원격 데이터베이스로 저장됨을 알 수 있다.
'Library, Tool' 카테고리의 다른 글
Frontend에서의 Bundler (0) | 2024.09.25 |
---|---|
웹 성능을 높일 수 있는 bundler plugins (2) | 2024.09.11 |
CSS Framework들의 특징과 장단점 비교 (tailwind, styled-componets) (0) | 2024.07.09 |
Recoil 사용이유와 사용방법 (1) | 2024.01.08 |
상태 관리 라이브러리 비교: Redux vs Justand vs Recoil (0) | 2024.01.07 |