git 내부 동작 살펴보기

jeong_hyeok·2025년 8월 1일

git add

git init

.git 폴더가 생김.

폴더 내부는 아래와 같음.

objects 폴더 내부


f1.txt 파일 생성

내용은 a

.git 폴더에는 변경 사항 없음.


git add f1.txt

objects 폴더 수정되고 index(Staging Area) 파일 생성됨.

objects 폴더 내부

2e 폴더가 새로 생기고, 2e 폴더 내부에는 65efe2a145dda7ee51d1741299f848e5bf752e 라는 이름의 파일이 생성됨.

이 파일에는 f1.txt의 내용(a)이 기록됨.

파일의 이름(f1.txt)은 index 파일에 기록됨.

  • f1.txt라는 파일의 내용이 2e65efe2a145dda7ee51d1741299f848e5bf752e에 들어 있다는 정보가 기록됨.
  • 2e65efe2a145dda7ee51d1741299f848e5bf752e는 objects에 생성된 폴더 이름과 파일 이름을 붙인 것과 동일.
  • 2e65efe2a145dda7ee51d1741299f848e5bf752e는 데이터와 헤더로 생성한 SHA-1 체크섬.
  • Git은 데이터를 저장할 때 데이터와 헤더로 생성한 SHA-1 체크섬의 앞 2자리로 폴더 이름을, 나머지로 파일 이름을 짓는다.

objects 폴더 내부의 파일들을 object라고 부름.


f1.txt 복사 -> f2.txt 생성 -> git add f2.txt

objects 폴더 변화 없음.

index 파일만 수정됨.

f2.txt 파일의 내용이 2e65efe2a145dda7ee51d1741299f848e5bf752e에 들어 있다는 정보가 기록됨. 복사한 내용이므로 f1.txt와 같은 object 파일을 가리킴.


f3.txt 생성

내용은 a (f1.txt나 f2.txt를 복사하지 않고 직접 작성)

objects 폴더 변화 없음.

index 파일만 수정됨.

내용이 같으면 동일한 object 파일을 가리킨다는 것을 알 수 있음.

git commit

git commit -m "initial commit"

objects 폴더 내부

2개의 object가 추가로 생성됐다.

git cat-file -t (SHA-1 key) 명령어로 해당 object가 무슨 object인지 알 수 있다.

기존에 생성했던 f1.text, f2.text, f3.text의 내용을 담은 object는 blob object이다.

커밋에 대한 결과로 tree object와 commit object가 생성됐다.

git cat-file -p (SHA-1 key) 명령어로 파일의 내용을 읽을 수 있다.


먼저 커밋 object를 읽어보자.

  • tree object의 object name
  • 커밋한 사용자
  • 커밋 메시지

가 내용으로 들어 있다.


다음으로, tree object를 읽어보자.

파일들의 object name, 파일 이름 등이 들어 있다.


아래와 같이 폴더를 만들고 커밋해보자. 폴더 안에는 ff1.txt라는 파일을 만들었고, 내용은 동일하게 a로 작성했다.

objects 폴더 내에 2a, b5, d5가 새로 생겼다. object name으로 3개 다 조회해 보자.

commit object 1개, tree object 2개가 생겼다.

  • parent: 이전 버전의 커밋 object name이다. (부모 커밋)

.git 파일이 있는 폴더의 object들이 저장되어 있다.

folder 폴더 내부의 object가 저장되어 있다.

정리

간단하지만 가장 많이 사용하는 git 명령어인 add와 commit을 사용했을 때 .git 파일에 어떤 변화들이 일어나는지 살펴보았다.

object 파일은 총 3가지 유형을 관찰할 수 있었다.

  • BLOB
    - Binary Large Object
    - 파일 객체
    - 일종의 불변 객체
    - SHA1 체크섬을 이용해서 파일 내용을 식별 가능
  • tree
    - 파일 시스템의 디렉토리와 유사하다.
    - 서브 트리 혹은 blob object를 가질 수 있다.
  • commit
    - 부모 커밋에 대한 참조
    - 커밋 메시지
    - tree

추가로,

  • branch
    - 특정 커밋에 대한 참조이다.
    - 커밋이 3개 있고 third commit의 부모가 second commit, second commit의 부모가 first commit일 때, main branch는 third commit에 대한 참조이다.

  • 스테이지
    - 커밋을 준비하는 공간
    - 워킹 트리(git에서 관리하는 사용자 디렉토리)의 파일을 add 명령으로 스테이지에 개별적으로 추가
    - 스테이지에 있는 내용 전체를 이용해 트리를 생성
    - 생성된 트리로 커밋을 만듦

  • Git은 변경 사항을 저장하지 않는다. 파일 전체를 저장한다.
    - 100MB 파일에 1MB의 수정 사항이 생기면, 기존의 100MB 파일은 그대로 있고, 101MB 파일이 추가로 생긴다.

  • push
    - 현재 브랜치의 커밋들 중 리모트에 없는 커밋을 리모트로 동기화하는 명령

  • Git index 파일
    - https://git-scm.com/docs/index-format
    - https://johngrib.github.io/wiki/git/index/

0개의 댓글