본문 바로가기
Web

git의 내부구조 대해 알아보자!

by alphaca202 2025. 1. 7.

git은 Content-addressable 파일 시스템이며

VCS 사용자 인터페이스를 가지고 있음 ! 

 

Plumbing 명령과 Porcelain 명령

 

Plumbing 명령 : 고수준 명령어 - 우리가 사용하는 명령어들 ex) add, commit, branch 과 같은 

Porcelain 명령 : 저수준 명령어 - git의 내부구조에 접근하는 명령어들 

 

 

.git 디렉토리의 요소

 

- HEAD 파일 : 현재 Checkout 한 브랜치

- index 파일 : Staging Area의 정보를 저장

- object 디렉토리 : 모든 컨텐트를 저장하는 데이터베이스

- refs 디렉토리 : 커밋 개체의 포인터(브랜치, 태그, 리모트 등)를 저장

 

Content-addressable 파일 시스템 

 

git은 Content-addressable 파일시스템임 -> Key : Value 데이터 저장소 

 

git의 핵심 요소에는 4가지 종류의 개체가 있는데 Blob, Tree, Commit, Tag가 그것임

그리고 얘네는 모두 sha-1 해쉬 값을 가지고 있음

object 디렉토리 내부를 살펴보면 -> 디렉토리와 파일들이 들어있는데 

sha-1 값의 앞의 두글자가 디렉토리 이름이 되고

나머지 38 글자가 파일 이름이 된다. 

 

tree Object는 blob Object로 구성되어 있음 

commit object는 tree를 참조하고 있음

 

출처 - git 공식문서

 

 

두개의 파일을 어떻게 비교? 

 

이전 커밋의 트리와 비교 blob 단위로 달라졌으면 새로운 blob 참조하도록 수정

바뀌지 않았으면 참조 수정 x -> 저장 공간 효율적 사용

 

merge 방법들 ? (4가지)

 

중심 브랜치(A)와 다른 브랜치(B) -> B를 A로 병합하는 상황

1. 3-way merge

  • 가장 일반적인 방법

2. fast-forward merge ( 조건 : 중심브랜치에 commit 내역이 없을 때 )

3. rebase

  • 커밋을 중심 브랜치에 연결해서 이어줌 -> 그걸 중심 브랜치로!
  • 커밋 기록 예쁘게 유지하기 위해~ 3-way로 하면 브랜치가 많으면 커밋 기록도 너무 중첩돼서 복잡해짐!

4. squash

  • B 가 간단한 중요하지 않은 브랜치일 경우 이런 식으로 B의 커밋기록 그냥 A에 하나의 커밋으로 합쳐버림 

 

참고자료

https://git-scm.com/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-Plumbing-%eb%aa%85%eb%a0%b9%ea%b3%bc-Porcelain-%eb%aa%85%eb%a0%b9

 

Git - Plumbing 명령과 Porcelain 명령

10.1 Git의 내부 - Plumbing 명령과 Porcelain 명령 여기까지 다 읽고 왔든지 바로 여기부터 보기 시작했던지 간에 이제 마지막 장이다. 이번 장은 Git이 어떻게 구현돼 있고 내부적으로 어떻게 동작하는

git-scm.com