Distributed Version Control System
소스 코드를 효과적으로 관리하기 위한 '분산형 버전 관리 시스템'입니다.
Q) Version Control System 이란?
파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전(스냅샷)을 다시 꺼내올 수 있는 시스템입니다.
Q) Distributed Version Control System 이란?
로컬, 리모트 서버는 마지막 스냅샷만을 저장하지 않고 델타와 스냅샷 등 모든 '히스토리' 내역을 보유합니다. 만약 리모트 서버에 문제가 생기면 로컬 저장소에 있는 복제물로 다시 작업할 수 있습니다. 왜냐하면 로컬 서버와 리모트 서버 모두 '동일한' 파일을 가지고 있기 때문입니다.
델타 : 저장소 이전 버전과 다음 버전 변경 내역에 관한 데이터
스냅샷 : 특정 버전의 소스코드
git은 각 시점의 스냅샷과 델타를 함께 저장합니다. git은 델타로 저장할지 아니면 스냅샷으로 저장할지 '스스로' 판단하여 속도 & 메모리 비효율을 최소화합니다.
왼쪽 그림은 rev 버전별 스냅샷만을 저장한 방식입니다. 반면 오른쪽 그림은 마지막 버전 파일 하나만 스냅샷 방식으로 저장하고 그 이전 버전들은 모두 델타로 저장한 방식입니다. 만약 rev4 버전 코드를 요구한다면 왼쪽 그림은 해당 버전의 스냅샷을 바로 보여줄 수 있습니다. 하지만 오른쪽 그림에서는 rev6의 스냅샷에서 rev5, rev4의 델타를 적용해서 보여줍니다.
만약 스냅샷의 크기가 약 1kb이고 파일의 변경이 거의 없다면 스냅샷을 모두 저장하는 왼쪽 방식은 메모리 낭비가 발생합니다. 따라서 git은 두가지 방식을 혼용하여 '스스로' 판단하에 저장합니다.
프로젝트의 모든 히스토리가 로컬에도 동일하게 있기 때문에 네트워크 속도에 영향 받지 않습니다. (물론, github같이 remote server에 올리는 경우에는 받습니다.) 예를 들어, 프로젝트의 히스토리를 조회할 때 리모트 서버에 접근할 필요 없이 로컬에서 해당 파일을 바로 찾을 수 있습니다. 와이파이가 없거나, VPN에 연결되 있지 않아도 막힘없이 일을 할 수 있습니다.
git은 파일을 저장하기 전 SHA-1 Hash를 사용하여 체크섬을 구하고, 파일을 관리합니다. 체크섬은 40자리의 16진수 문자열로 구성되며, commit id로 불립니다. commit id가 같은 것은 파일 내용 및 디렉토리 구성이 완벽히 같다는 것으로, commit id로 각각의 커밋을 구별합니다. 모든 파일이 체크섬이라는 검사를 거쳐 잘못된 파일을 수정, 삭제할 일이 없습니다.
git 작업 flow
Reference
https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EA%B8%B0%EC%B4%88