안녕하세요 글루미입니다.
오늘은 `Git`에 대해 학습한 내용을 정리하려고 합니다.
정확하게는 `Git` 개체에 대한 내용인데요, 정보의 출처는 모두 하단의 링크에서 참고했습니다.
https://git-scm.com/book/ko/v2/Git의-내부-Git-개체
Git - Git 개체
여러분이 사용하는 쉘이 어떤 것인가에 따라 master^{tree} 표현식이 오류를 일으킬 수도 있다. Windows 에서 CMD는 ^ 문자는 이스케이프 기호로 사용한다. ^ 문자를 제대로 사용하려면 git cat-file -p master
git-scm.com
위 링크는 그동안 흔히 사용해 왔던 `Git`의 고수준 명령어인 `add`, `status`, `commit` 등이 아닌 저수준의 명령어를 활용하여 `Git`의 여러 동작을 설명하고 있습니다.
Git 개체
`Git`의 핵심은 `Key-Value` 쌍으로 이루어진 데이터 저장소라는 것입니다. 어떤 형식의 데이터라도 집어넣을 수 있고 해당 `Key`로 언제든지 데이터를 다시 가져올 수 있습니다. `Git` 개체는 `blob`, `tree`, `commit` 개체가 있고, 모두 `. git` 디렉터리 하위에 저장됩니다.
blob
`blob` 개체는 파일의 내용을 저장하는 개체입니다. 파일 이름 등의 메타 데이터는 저장하지 않고 오로지 파일의 내용만 저장하게 됩니다.
$ echo 'test content' | git hash-object -w --stdin
d670460b4b4aece5915caf5c68d12f560a9fe3e4
예를 들어 위와 같이 저장하게 되면, 사용자의 표준 입력을 받아 `Git`의 `blob`개체로 저장하게 됩니다. 이때, 파일의 내용을 읽어서 저장한 것이 아니기 때문에 당연히 파일 이름의 대한 내용은 존재하지도 않게 됩니다. 따라서, 해당 개체의 해시값만 알고 있다면 개체의 내용을 어떤 파일에든 복원할 수 있습니다.
$ git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4 > test.txt
$ cat test.txt
test content
위와 같이 해당 해시값을 이용해 `blob`개체에 저장되어 있는 내용을 `test.txt`에 복원할 수 있습니다.
tree
`tree`개체는 쉽게 설명하면 `blob`개체와 `tree`개체의 메타 데이터를 저장하는 개체입니다.
$ git cat-file -p master^{tree}
100644 blob a906cb2a4a904a152e80877d4088654daad0c859 README
100644 blob 8f94139338f9404f26296befa88755fc2598c289 Rakefile
040000 tree 99f1a6d12cb4b6f19c8655fca46c3ecf317074e0 lib
위와 같이 `tree`개체에 저장된 내용을 살펴보면 파일의 모드와 `blob`개체인지 `tree`개체인지, 그리고 각각의 해시값과 파일명 혹은 디렉토리명이 저장되어 있는 것을 볼 수 있습니다. 위 `tree`개체를 도식화한 그림으로 나타내면 다음과 같습니다.
commit
`commit` 개체의 구조는 커밋 메시지와 함께 커밋할 `tree` 개체의 해시값, 그리고 이전 커밋의 해시값을 이용하고, 커밋하게 되면 다음과 같은 형태의 커밋 개체가 생성됩니다.
$ echo 'first commit' | git commit-tree d8329f
fdf4fc3344e67ab068f836878b6c4951e3b15f3d
$ git cat-file -p fdf4fc3
tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579
author Scott Chacon <schacon@gmail.com> 1243040974 -0700
committer Scott Chacon <schacon@gmail.com> 1243040974 -0700
first commit
`first commit` 이라는 메시지와 함께 커밋할 `tree` 개체의 해시값을 명령어의 `argument`로 넘겨주고 생성된 커밋 개체의 내용을 살펴보면 `tree`개체의 해시정보와 함께 `author`, `committer`, 그리고 `commit message`가 적혀있는 것을 볼 수 있습니다. 커밋 개체는 다음과 같은 형태를 가집니다.
그림에 대한 자세한 설명은 포스팅 상단에 위치한 링크에 들어가시면 더욱 자세히 보실 수 있습니다.
'Naver boostcamp' 카테고리의 다른 글
[학습 정리] 네이버 부스트캠프 챌린지 Day16 학습 정리 (0) | 2024.08.05 |
---|---|
[회고] 네이버 부스트캠프 9기 챌린지 3주차 위클리 회고 (0) | 2024.08.04 |
[학습 정리] 네이버 부스트캠프 챌린지 Day11 학습 정리 (0) | 2024.07.29 |
[회고] 네이버 부스트캠프 9기 챌린지 2주차 위클리 회고 (0) | 2024.07.28 |
[학습 정리] 네이버 부스트캠프 챌린지 Day09 학습 정리 (0) | 2024.07.25 |