2022. 9. 7. 17:38ㆍGit
거의 모든 개발자는 Git을 사용한다.
Git을 사용하는 이유는 여러가지가 있겠지만 아마 저장의 편의성 때문이지 않을까 생각한다.
그럼 Git commit을 입력 했을 때 어떤 일이 일어나는지 알고 있는가?
그 저장 방식을 알고 있는 사람은 극히 드물 것이라 생각된다.
코드의 작동 결과를 이해하는 방법에는 코드를 하나하나 살펴보는 방법도 있지만
DB를 열어서 어떤 결과가 저장되는지 확인하는 방법도 있다.
이렇듯, Git 역시 DB를 확인한다면 훨씬 더 Git에 대한 이해도가 올라갈 수 있을 것이다.
🧐 Git의 DB
Git은 어떤 종류의 DB를 가지고 있을까?
RDB? NoSQL?
Key : Value 형태로 저장되기 때문에 NoSQL의 범주에 포함된다.
그럼 어떤 것이 key고 어떤 것이 value 일까?
그것은 아래에서 차차 알아보도록 하자.
Git의 DB는 또 다른 특징을 가지고 있다.
일반적인 RDB 혹은 NoSQL의 경우 CRUD
즉, 읽기, 생성, 수정, 삭제가 모두 가능하다.
하지만 Git의 DB는 오직 읽기와 생성 밖에 되지 않는다.
그렇기 때문에 아주 안전하게 데이터가 보관될 수 있다.
그럼 커밋을 같이 살펴보도록 하자.
🧐 commit의 구성 요소
우리의 커밋은 어떻게 구성되어 있을까?
커밋은 3가지로 구성된다.
- 메타 데이터 (커밋 메시지, 이메일, 날짜*시간....)
- 프로젝트 스냅샷 hash
- 부모 커밋의 hash
이것만 가지고는 감이 전혀 오지 않는다.
그렇기 때문에 간단한 예시를 통해서 살펴보자.
1개의 src 폴더 아래에 2개의 파일이 있다고 생각해보자.
hello.txt, world.txt.
그리고 각각의 txt파일에는 파일이름과 같은 문자 즉, hello와 world가 저장되어 있다고 가정하자.
깃 commit을 날린다면 깃은 각각의 프로젝트 스냅샷 hash를 생성한다.
hello.txt의 hash를 1a2b3c라고 가정하고, world.txt의 hash를 1q2w3e라고 가정해보자.
그러면 DB에는 다음과 같이 저장된다.
{"1a2b3c" : "hello"}
{"1q2w3e" : "world"}
여기까지 읽었다면 뭔가 이상함을 느낄 것이다.
파일의 이름은?
파일 이름은 src폴더가 커밋 될 때 같이 저장된다.
그렇기 때문에 src는 조금 다른 형태로 저장된다.
src의 hash를 5abdf12라고 가정하자.
{
"5abdf12" :
{
{
"name" : "hello.txt",
"content" : "1a2b3c"
},
{
"name" : "world.txt",
"content" : "1q2w3e"
}
},
{
"message" : "intial commit",
"hash" : "5abdf12",
"parent_hash" : NULL
}
}
(구조는 조금 다를 수 있지만 내용물은 동일하다.)
이렇게 포함하고 있는 이름과 메시지를 포함한다.
그리고 마지막에 있는 parent_hash를 보면 알겠지만 git은 부모노드의 hash를 가지고 있다.
즉, tree 형태로 구성되어 있다는 것을 알 수 있다.
sourceTree를 사용해 보신 분들은 알 것이다.
선따라 가는 커밋을...(사실 이름부터 sourceTree다)
🧐 다음에는...
다음에는 자세한 커밋의 사용방법과 구성에 대해서 살펴보자.(살펴보고 싶다.)
'Git' 카테고리의 다른 글
(Git) 유구한 역사를 가진(?) 컨벤셔널 커밋 (0) | 2022.07.28 |
---|