Post
KO

Github

왜 선형으로 관리 안하고, 그래프로 관리하냐

깃 내부 구조에 대해 알아보자.

Git은 애플리케이션이다.

+—————————+

application

+—————————+

.git(폴더) 저장소

+—————————+

Key, value 저장소 이다.

Value => Blob, Tree Commit

Git의 3대 자료구조

Blob

Git commit 시 commit 될 때 파일 내용은 Hashing, 되어 Blob으로 저장 됨.

저장 위치

.git/objects

예를 들어

Tree

파일 A가 Hello world로 저장되어 있는데

파일 B도 Hello world로 저장하면

해시 값이 동일하다..

파일간의 관계를 Tree 형태로 저장한다.

Commit

작성자

Message

Parent commit

Add 된 파일들

40글자의 해시값으로 나온다.

SHA-1 로 저장하면 40 글자가 나온다.

그래프

![](/assets/images/posts/222003624668/869010dd4b98.png?type=w580)

DAG= http://wiki.hash.kr/index.php/%EB%B0%A9%ED%96%A5%EC%84%B1_%EB%B9%84%EC%88%9C%ED%99%98_%EA%B7%B8%EB%9E%98%ED%94%84

방향성 비순환 그래프

Reset –HARD => 파일 시스템도 바꾼다

Reset –soft => 개념상으로만 변경

Branch

.git/refs에 저장된 파일 1개 이다.

![](/assets/images/posts/222003624668/ece1114b15bd.png?type=w580)

요 파일안에는 해시값이 들어 있다.

![](/assets/images/posts/222003624668/474e51b75bcd.png?type=w580)

Merge 커밋

두개의 commit 해시를 가지고 있는 구조이다.

**Rebase **

현재 커밋 내용을 다른 커밋 그래프로 이동시키는 것

B A

ㅇ ㅇ

 

ㅇ ㅇ

\ /

| ㅇ |

A를 B로 Rebase를 하겠다는 것은

B를 Base로 삼아서 생성됨으로

A와 B의 공통 부모 위치에서

A커밋이 추가된다.

A2

A1

b2

b1

o

B를 A로 Rebase로 하겠다는 것은

A와 B의 공통부모 위치에서

A의 브런치에서 B의 커밋이 추가된다.

b2

b1

A2

A1

o

Git은 Time Machine, Space Ship 이다.

rebase를 잘 다루면 앞서 진행된 커밋 내용도 수정되어 반영할 수 있다.

Git에서는 Insert, select만 존재한다.

흔히, 알고 있는 git commit –amend 는 수정이 아닌 생성이다.

자세히보면 아래와 같다고 한다.

abf

**O ** <—— commit - -ammend

O

o

abf 76c <— 변경됨

O O

\
O | O

역사가 간단해야 유지보수가 편하다.

유지 보수 관점에서는 로그 그래프는 간편해야 한다.

This article is licensed under CC BY 4.0 by the author.