Jin's IT Story.

Git은 변경 이력을 어떻게 저장할까 커밋과 스냅샷 원리

| 2026-11-09
목차
    Git의 스냅샷 저장 방식을 상징하는 입체적인 블루 톤 카메라 아이콘 3D 일러스트

    소프트웨어 개발에서 필수적인 버전 관리 도구인 Git은 기존의 시스템들과 근본적으로 다른 방식으로 데이터를 저장합니다. 대부분의 이전 버전 관리 시스템이 파일의 차이점을 연속적으로 기록한 반면, Git은 특정 시점의 전체 파일 상태를 사진 찍듯 저장하는 방식을 활용합니다.

    이러한 Git 동작 원리를 정확히 이해하면 단순한 명령어 암기를 넘어 커밋과 브랜치가 실제로 어떻게 구동되는지 직관적으로 파악할 수 있습니다. 시스템 내부에서 이력이 저장되는 핵심 메커니즘을 알아두면 개발 생산성을 대폭 높일 수 있습니다.

    델타 저장 방식과 Git 스냅샷의 차이점

    기존의 차이점 기반 버전 관리 시스템은 초기 파일 데이터에 매번 변경된 코드의 줄 단위 차이점(Delta)만을 덧붙여 기록했습니다. 이 방식은 저장 용량을 아낄 수 있지만, 과거 특정 시점의 전체 코드를 복원하려면 모든 차이점을 처음부터 계산해야 한다는 단점이 있었습니다.

    반면 Git은 특정 시점의 전체 프로젝트 파일 상태의 순간을 담은 스냅샷 방식을 채택했습니다. 파일이 변경될 때마다 그 시점의 전체 모습을 새로 찍어 저장하고, 만약 변경되지 않은 파일이 있다면 새로 저장하는 대신 이전 파일에 대한 링크만 연결합니다.

    이러한 스냅샷 방식 덕분에 과거 특정 커밋으로 돌아갈 때 추가 계산 없이 순식간에 데이터를 불러올 수 있습니다. 용량 효율성과 복원 속도를 모두 잡은 데이터 구조가 바로 이 시스템의 핵심 기반입니다.

    커밋 구조를 이루는 핵심 객체 3가지

    Git 동작 원리의 내부를 살펴보면 크게 블롭(Blob), 트리(Tree), 커밋(Commit)이라는 세 가지 핵심 객체가 존재합니다. 각 객체는 고유한 역할을 맡아 프로젝트의 상태를 안정적으로 유지합니다.

    • 블롭(Blob): 파일의 내용 자체를 압축하여 저장하는 객체로, 파일명이나 경로 정보는 가지지 않고 오직 데이터 내용만을 보관합니다.
    • 트리(Tree): 파일 시스템의 디렉터리 역할을 담당하며, 블롭의 해시값과 파일 이름, 그리고 하위 트리의 정보를 목록 형태로 연결해 전체 폴더 구조를 형성합니다.
    • 커밋(Commit): 최상위 트리를 가리키는 포인터와 작성자 정보, 작성 시간, 커밋 메시지를 하나로 묶은 데이터입니다.

    이 커밋 객체는 바로 직전의 이전 커밋(Parent Commit)의 해시값을 포함하여 생성됩니다. 이를 통해 커밋들이 사슬처럼 줄지어 연결되는 커밋 구조를 완성하게 되며, 완벽한 시간 순서의 이력 추적이 가능해집니다.

    포인터에 불과한 브랜치 원리

    개발 과정에서 브랜치를 생성하고 전환하는 속도가 매우 빠른 이유는 브랜치가 데이터 전체의 복사본이 아니기 때문입니다. Git의 브랜치 원리는 생각보다 아주 단순하게 구현되어 있으며, 특정 커밋 객체를 가리키는 40자리 해시값이 적힌 가벼운 포인터에 불과합니다.

    새로운 브랜치를 만들면 파일 전체를 복사하는 것이 아니라, 현재 작업 중인 커밋을 가리키는 조그마한 포인터 파일 하나만 생성됩니다. 코드를 수정하고 새로운 커밋을 생성하면 브랜치 포인터는 자동으로 새로 만들어진 커밋을 가리키도록 한 칸 이동합니다.

    마찬가지로 브랜치를 전환하는 작업 역시 파일 내용을 변경하는 것과 함께 현재 바라보는 브랜치 포인터(HEAD)의 위치만 바꿈으로써 순식간에 완료됩니다. 수천 개의 파일이 있는 대형 프로젝트에서도 브랜치 작업이 순식간에 일어나는 이유가 여기에 있습니다.

    효율적인 이력 관리가 주는 이점

    이처럼 스냅샷 구조와 가벼운 포인터를 활용한 Git 동작 원리는 개발자에게 엄청난 속도와 안정성을 제공합니다. 로컬 컴퓨터 내부에서 대부분의 이력 조회가 완벽하게 처리되므로 네트워크 연결 없이도 빠른 연산이 가능합니다.

    또한 한 번 저장된 커밋 객체는 무작위 암호화 해시 알고리즘으로 고유 식별자가 부여되기 때문에 데이터의 손상이나 변조 여부를 즉시 검증할 수 있습니다.

    내부를 흐르는 스냅샷과 커밋 구조, 그리고 브랜치 원리를 이해하고 나면 더욱 자신감 있게 버전 관리를 수행하고 복잡한 작업 흐름 속에서도 데이터의 흐름을 명확히 파악할 수 있습니다.