Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Git 해부하기

Git 해부하기

Buzzvil

July 15, 2022
Tweet

More Decks by Buzzvil

Other Decks in Programming

Transcript

  1. 사전 준비 • mkdir • cd • echo • find

    • tree • cat • shasum / openssl • > (redirection) • | (pipe)
  2. Git 명령어 git <command> <args…> git help git Git 명령어는

    2가지 종류가 있습니다. 무엇일까요?
  3. 내용 주소화 파일 시스템 (Content-addressable Filesystem) 같은 내용에 대해 항상

    같은 파일 주소를 가지는 파일 시스템 echo -n "Buzzvil\n" | shasum 또는 echo -n "Buzzvil\n" | openssl dgst -sha1
  4. 내용 주소화 파일 시스템 (Content-addressable Filesystem) 같은 내용에 대해 항상

    같은 파일 주소를 가지는 파일 시스템 echo -n "Buzzvil\n" | shasum 또는 echo -n "Buzzvil\n" | openssl dgst -sha1
  5. 내용 주소화 파일 시스템 (Content-addressable Filesystem) 같은 내용에 대해 항상

    같은 파일 주소를 가지는 파일 시스템 운영체제의 파일 시스템 Git의 내용 주소화 파일 시스템 buzzvil Buzzvil\n 14cd3c9a57ab8474dc07757829b1313a51a9eb29 Buzzvil\n 저장 불러오 기
  6. Git의 내용 주소화 파일 시스템 살펴보기 echo -n "Buzzvil\n" >

    buzzvil git add buzzvil git commit -m "Initial commit"
  7. Git의 내용 주소화 파일 시스템 살펴보기 # unzlib.py import sys

    import zlib with open(sys.argv[1], 'rb') as f: print(zlib.decompress(f.read())) wget byb.kr/unzlib.py
  8. Git Object • Blob • Tree • Commit • Tag

    구조 <타입> <본문 길이>\x00<본문>
  9. Git Object - Blob 파일의 데이터를 저장하는 역할을 하는 object

    blob <본문 길이>\x00<본문> echo -n "blob 8\x00Buzzvil\n" | shasum
  10. Git Object - Blob 파일의 데이터를 저장하는 역할을 하는 object

    blob <본문 길이>\x00<본문> echo -n "blob 8\x00Buzzvil\n" | shasum
  11. Git Object - Blob 파일의 데이터를 저장하는 역할을 하는 object

    blob <본문 길이>\x00<본문> echo -n "blob 8\x00Buzzvil\n" | shasum
  12. 자주 쓸 명령어 find .git/objects -type f # git이 관리하는

    object 목록 git cat-file -t bce5 # object 타입 python3 unzlib.py .git/objects/../… # 압축만 풀고 살펴보기 git cat-file -p bce5 # object를 읽기 좋게 표시
  13. Git Object - Tree • Tree와 Blob을 배열의 형태로 가질

    수 있음 • Tree와 Blob의 이름을 저장
  14. Git Object - Tree python3 unzlib.py .git/objects/6a/194… <타입> <본문 길이>\x00<본문>

    <file_mode> <file_name>\x00<file_hash> <file_mode> <file_name>\x00<file_hash> <file_mode> <file_name>\x00<file_hash> …
  15. Git Object - Tree in Tree mkdir jamsil echo -n

    "Buzzvil\n" > jamsil/buzzvil git add jamsil git commit -m "Add Jamsil" (root) jamsil buzzvil buzzvil 6a19 bce5
  16. find .git/objects -type f Git Object - Tree in Tree

    (root) jamsil buzzvil buzzvil 6a19 bce5
  17. git cat-file -t 2ed8 Git Object - Tree in Tree

    (root) jamsil buzzvil buzzvil 6a19 bce5
  18. git cat-file -t 2ed8 Git Object - Tree in Tree

    (root) jamsil buzzvil buzzvil 6a19 bce5
  19. git cat-file -p 2ed8 Git Object - Tree in Tree

    (root) jamsil buzzvil buzzvil 6a19 bce5
  20. git cat-file -p 2ed8 Git Object - Tree in Tree

    (root) jamsil buzzvil buzzvil 6a19 bce5
  21. git cat-file -p 2ed8 Git Object - Tree in Tree

    (root) jamsil buzzvil buzzvil 6a19 bce5 2ed8 6a19 bce5
  22. Git Object - Tag Git의 Tag는 2가지가 있다. • Annotated

    Tag ← 커밋처럼 메시지를 남기고, 서명을 할 수 있는 태그, object • Lightweight Tag ← 버즈빌의 대부분 태그
  23. Git Object - Tag git tag -a company bce5 -m

    "Our company" git show company
  24. Git Object - Tag git tag -a company bce5 -m

    "Our company" git show company
  25. Git Object • Blob • Tree • Commit • Tag

    구조 <타입> <본문 길이>\x00<본문>
  26. 자주 쓴 명령어 find .git/objects -type f # git이 관리하는

    object 목록 git cat-file -t bce5 # object 타입 python3 unzlib.py .git/objects/../… # 압축만 풀고 살펴보기 git cat-file -p bce5 # object를 읽기 좋게 표시
  27. 전체 그림 Buzzvil\n 6a19 bce5 Initial commit Add Jamsil 82a2

    442d parent tree tree 2ed8 company v1.0 jamsil buzzvil buzzvil object object d837 3f91
  28. 브랜치 살펴보기 git cat-file -p master # parent 얻기 echo

    -n "82a26d…" > .git/refs/heads/develop git branch 또는 git update-ref refs/heads/master 82a26d…
  29. 브랜치 살펴보기 git cat-file -p master # parent 얻기 echo

    -n "82a26d…" > .git/refs/heads/develop git branch 또는 git update-ref refs/heads/master 82a26d…
  30. HEAD와 브랜치 살펴보기 echo -n "ref: refs/heads/master" > .git/HEAD git

    branch git show 또는 git symbolic-ref HEAD refs/heads/master
  31. HEAD와 브랜치 살펴보기 echo -n "ref: refs/heads/master" > .git/HEAD git

    branch git show 또는 git symbolic-ref HEAD refs/heads/master
  32. HEAD와 브랜치 살펴보기 Buzzvil\n 6a19 bce5 Initial commit Add Jamsil

    82a2 442d parent tree tree 2ed8 company v1.0 jamsil buzzvil buzzvil object object d837 3f91
  33. HEAD와 브랜치 살펴보기 Buzzvil\n 6a19 bce5 Initial commit Add Jamsil

    82a2 442d parent tree tree 2ed8 company v1.0 jamsil buzzvil buzzvil object object d837 3f91 HEAD
  34. HEAD와 브랜치 살펴보기 Buzzvil\n 6a19 bce5 Initial commit Add Jamsil

    82a2 442d parent tree tree 2ed8 company v1.0 jamsil buzzvil buzzvil object object d837 3f91 HEAD heads/master
  35. HEAD와 브랜치 살펴보기 Buzzvil\n 6a19 bce5 Initial commit Add Jamsil

    82a2 442d parent tree tree 2ed8 company v1.0 jamsil buzzvil buzzvil object object d837 3f91 HEAD heads/master heads/develop
  36. Tag 살펴보기 find .git/refs/tags -type f -print -exec cat {}

    \; Buzzvil\n 6a19 bce5 Initial commit Add Jamsil 82a2 442d parent tree tree 2ed8 company v1.0 jamsil buzzvil buzzvil object object d837 3f91 heads/develop heads/master HEAD
  37. Tag 살펴보기 find .git/refs/tags -type f -print -exec cat {}

    \; Buzzvil\n 6a19 bce5 Initial commit Add Jamsil 82a2 442d parent tree tree 2ed8 company v1.0 jamsil buzzvil buzzvil object object d837 3f91 heads/develop heads/master HEAD tags/v1.0 tags/company
  38. Tag 살펴보기 find .git/refs/tags -type f -print -exec cat {}

    \; Buzzvil\n 6a19 bce5 Initial commit Add Jamsil 82a2 442d parent tree tree 2ed8 company v1.0 jamsil buzzvil buzzvil object object d837 3f91 heads/develop heads/master HEAD tags/v0.0.1 tags/v1.0 tags/company
  39. HEAD와 브랜치 살펴보기 git cat-file -p 2ed8 # jamsil 해시

    구하기 echo -n "6a19…" > .git/refs/tags/jamsil git tag git show jamsil git show company 또는 git update-ref refs/tags/jamsil 6a19…
  40. HEAD와 브랜치 살펴보기 git cat-file -p 2ed8 # jamsil 해시

    구하기 echo -n "6a19…" > .git/refs/tags/jamsil git tag git show jamsil git show company 또는 git update-ref refs/tags/jamsil 6a19…
  41. Tag 살펴보기 Buzzvil\n 6a19 bce5 Initial commit Add Jamsil 82a2

    442d parent tree tree 2ed8 company v1.0 jamsil buzzvil buzzvil object object d837 3f91 heads/develop heads/master HEAD tags/v1.0 tags/v0.0.1 tags/company
  42. Tag 살펴보기 Buzzvil\n 6a19 bce5 Initial commit Add Jamsil 82a2

    442d parent tree tree 2ed8 company v1.0 jamsil buzzvil buzzvil object object d837 3f91 heads/develop heads/master HEAD tags/v1.0 tags/v0.0.1 tags/company
  43. Tag 살펴보기 Buzzvil\n 6a19 bce5 Initial commit Add Jamsil 82a2

    442d parent tree tree 2ed8 company v1.0 jamsil buzzvil buzzvil object object d837 3f91 heads/develop heads/master HEAD tags/v1.0 tags/v0.0.1 tags/company tags/jamsil
  44. 전체 그림 Buzzvil\n 6a19 bce5 Initial commit Add Jamsil 82a2

    442d parent tree tree 2ed8 company v1.0 jamsil buzzvil buzzvil object object d837 3f91 heads/develop heads/master HEAD tags/v1.0 tags/company tags/jamsil tags/v0.0.1
  45. 참고 자료 • https://git-scm.com/book/en/v2/Git-Internals-Git-Objects • https://shafiul.github.io/gitbook/1_the_git_object_model.html • https://scribe.rip/geekculture/a-beginners-guide-to-git-and-git-internals-1e7dcd89d65e • https://scribe.rip/geekculture/git-branching-made-easy-1cc894b9fd03

    • https://stackoverflow.com/questions/737673/how-to-read-the-mode-field-of-git-ls-trees-output • https://mincong.io/2018/04/28/git-index/ • https://codewords.recurse.com/issues/two/git-from-the-inside-out • https://cuddly-octo-palm-tree.com/posts/2021-09-19-git-elements/ • https://www.leshenko.net/p/ugit/