Git: 델타와 스냅샷
: git에서 커밋을 저장하는 방식
- 과거에는 오픈소스 프로젝트를 diff와 patch를 통해 개발했다. 코드를 수정하고 diff 프로그램으로 델타를 생성해 전달하고 patch 프로그램으로 메인 코드에 적용했다고 한다.
- 현재는 git을 사용하면 스냅샷과 델타를 통해 변화된 사항을 관리한다.
- 한 브랜치의 히스토리에서 보이는 커밋은 델타 혹은 스냅샷
델타란?
: 커밋과 커밋 사이에서 변경된 사항을 델타라고 한다.
git push
를 했을 때 몇개의 델타가 있는지를 보여준다.- 모든 commit을 스냅샷으로 저장하면, 변동사항이 없는 부분까지 중복으로 관리하는 것이 되기 때문에 이러한 방식으로 관리
git diff
를 쳐서 봤던 것이 델타commit 1
->commit 2
->commit 3
이라고 할 때git diff commit3 commit1
와 같은 요청을 하면, commit 2 델타(diff)와 commit 1 델타를 적용해서 반환해주는 것
- 그렇다면 어느 시점에 델타로 변할까?
델타가 되는 시점
일단 커밋 하나가 있다면 이는 스냅샷으로 저장된다. 추후에 데몬스레드에서 돌고있는 GC에 의해 적정 시점에 기존의 사항들이 델타로 변경되는 것
뿐만 아니라, gzip으로 압축해 저장하기 때문에 실제로는 아주 효율적이라고 함
git gc
: 데몬스레드에 의해서가 아니라 직접 gc를 돌리고 싶다면 이 CLI를 사용- 직접 저장공간을 압축한 것
GC가 돌면서, 마지막 버전의 커밋만 스냅샷으로 두고, 나머지는 델타가 된다.
- 대부분의 경우 우리가 날리는 질의는 마지막 버전에 대한것이기 때문에
- 그런데, 어떠한 경우에도 마지막 버전만 스냅샷, 나머지는 델타인 것은 아니다.
모든 변경사항을 델타로만 저장하기에는, 변경된 부분이 너무많을 때 오히려 스냅샷으로 저장하는게 이득인 경우
- TODO : 직접 확인해보기
git verify-pack -v .git/objects/pack/pack-~~~
제대로 보는 법 알아보기