[학습 정리] Git 뜯어보기

김정현·2024년 7월 31일

Git

  • Git의 핵심은 단순한 Key-value 형태의 데이터 저장소
  • 어떤 형식의 데이터도 집어 넣을 수 있고, key 값을 통해서 언제든지 데이터를 다시 가져올 수 있다.

저수준 명령어

우리가 사용하는 git 명령어(고수준 명령어) git init git add git commit을 사용할 때 실제 GIT의 내부에서 실행되는 명령어를 저수준 명령어라고 한다
이러한 저수준 명령어는 GIT의 기본적인 데이터 구조와 알고리즘에 직접 접근할 수 있게 해주며, 일반적으로 고수준 명령어에 의해 호출된다.

GIT의 흐름(init ~ commit)

  1. 사용자가 git init을 입력하면 새로운 저장소를
    초기화할 때 objects(개체 데이터 베이스) 디레토리를 생성하고 하위에 pack 디렉토리와 info 디렉토리를 생성된다.

  2. 사용자가 git add를 입력하게 되면 저수준 명령어인 git hash-object가 GIT 내부에서 실행되면서 파일의 내용을 해싱하여 Blob 개체를 만들고, .git /objects 디렉토리에 저장한다.

  3. GIT 내부에서 저수준 명령어인 git update-index명령어가 실행되면서 생성된 Blob개체를 인덱스(스테이징 영역)에 추가한다.

  4. 사용자가 git commit을 입력하게 되면 저수준 명령어인 git write-tree가 실행되면서 현재 인덱스(스테이징 영역)을 기반으로 Tree개체를 생성한다. Tree개체 역시 .git/objects 디렉토리에 저장한다.

  5. git commit-tree명령어가 실행되면서 생성된 Tree개체를 기반으로 Commit개체를 생성한다.
    해당 개체도 마찬가지로 .git/objects 디렉토리에 저장한다.

Git 개체

Blob

  • Blob은 유닉스의 Inode나 일반 파일에 대응된다.

  • git hash-obejct 명령어를 통해 생성된다.

  • 파일의 내용을 기반으로 SHA-1 해시 알고리즘을 통해 나온 해시 값을 key로 사용한다.
    같은 내용의 파일은 항상 같은 해시 값을 가진다.

  • 40자 길이의 해시로 처음 2 글자를 따서 디렉토리 이름으로 사용하고 나머지 38글자는 파일 이름에 사용한다.

  • 파일의 내용이 변경될 때마다 새로운 Blob 개체가 생성이 되며, 새로운 해시 값이 반환된다.

Tree

  • Tree는 유닉스의 디렉토리에 대응된다.

  • Tree개체를 저장할 때는 git write-tree 명령어를 사용한다.

  • Tree개체는 항목을 여러개 가질 수 있다.
    항목: Blob 하위 트리 개체를 가리키는 SHA-1 포인터 파일 모드 개체 타입 파일 이름

  • GIT은 일반적으로 INDEX(스테이징 영역)의 상태대로 Tree 개체를 만들고 기록한다. 그렇기 때문에 Tree개체를 만들기 위해서는 INDEX(스테이징 영역)에 파일을 추가해야한다.

Commit

  • commit 객체는 프로젝트의 특정시점의 트리 상태를 저장하는 개체이다.

  • commit-tree 명령어를 통해 commit개체가 생성된다. 해당 명령에는 Tree개체의 SHA-1값 하나를 넘긴다.
    이때 -p 옵션을 통해서 부모 커밋을 지정할 수 있으며 이를 통해서 GIT 히스토리를 만들 수 있다.

  • commit개체의 형식: 최상단 Tree Author / Committer의 정보 시간 정보 commit message

profile
안녕하세요 반갑습니다

0개의 댓글