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. Git 해부하기
    2022-07-15
    Brice

    View Slide

  2. 손 들어봅시다: 나는 Git이 무섭다?

    View Slide

  3. View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. View Slide

  8. 사전 준비
    ● terminal
    ● git
    ● python3

    View Slide

  9. 사전 준비
    ● mkdir
    ● cd
    ● echo
    ● find
    ● tree
    ● cat
    ● shasum / openssl
    ● > (redirection)
    ● | (pipe)

    View Slide

  10. Git 명령어
    git
    git help git
    Git 명령어는 2가지 종류가 있습니다. 무엇일까요?

    View Slide

  11. Git 명령어
    git
    git help git

    View Slide

  12. Git 명령어
    git
    git help git

    View Slide

  13. Git 명령어
    git
    git help git

    View Slide

  14. View Slide

  15. Porcelain

    View Slide

  16. Porcelain
    Plumbing

    View Slide

  17. Git 의 계층 구조
    고수준 명령어 (Porcelain)

    View Slide

  18. Git 의 계층 구조
    저수준 명령어 (Plumbing)
    고수준 명령어 (Porcelain)

    View Slide

  19. Git 의 계층 구조
    내용 주소화 파일시스템
    저수준 명령어 (Plumbing)
    고수준 명령어 (Porcelain)

    View Slide

  20. Git 의 계층 구조
    내용 주소화 파일시스템
    저수준 명령어 (Plumbing)
    고수준 명령어 (Porcelain)

    View Slide

  21. Git 저장소 생성하기
    git init git-internal
    cd git-internal
    tree .git

    View Slide

  22. Git 저장소 생성하기
    git init git-internal
    cd git-internal
    tree .git

    View Slide

  23. Git 저장소 생성하기
    git init git-internal
    cd git-internal
    tree .git

    View Slide

  24. 내용 주소화 파일 시스템 (Content-addressable
    Filesystem)
    같은 내용에 대해 항상 같은 파일 주소를 가지는 파일 시스템

    View Slide

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

    View Slide

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

    View Slide

  27. 내용 주소화 파일 시스템 (Content-addressable
    Filesystem)
    같은 내용에 대해 항상 같은 파일 주소를 가지는 파일 시스템
    운영체제의 파일 시스템
    Git의 내용 주소화 파일 시스템
    buzzvil
    Buzzvil\n
    14cd3c9a57ab8474dc07757829b1313a51a9eb29
    Buzzvil\n
    저장
    불러오

    View Slide

  28. Git의 내용 주소화 파일 시스템 살펴보기
    echo -n "Buzzvil\n" > buzzvil
    git add buzzvil
    git commit -m "Initial commit"

    View Slide

  29. Git의 내용 주소화 파일 시스템 살펴보기
    git hash-object buzzvil

    View Slide

  30. Git의 내용 주소화 파일 시스템 살펴보기
    git hash-object buzzvil

    View Slide

  31. Git의 내용 주소화 파일 시스템 살펴보기
    git hash-object buzzvil

    View Slide

  32. Git의 내용 주소화 파일 시스템 살펴보기
    git cat-file -p bce5

    View Slide

  33. Git의 내용 주소화 파일 시스템 살펴보기
    git cat-file -p bce5

    View Slide

  34. Git의 내용 주소화 파일 시스템 살펴보기
    find .git/objects -type f

    View Slide

  35. Git의 내용 주소화 파일 시스템 살펴보기
    find .git/objects -type f

    View Slide

  36. Git의 내용 주소화 파일 시스템 살펴보기
    find .git/objects -type f

    View Slide

  37. Git의 내용 주소화 파일 시스템 살펴보기
    cat .git/objects/bc/e568648779a…

    View Slide

  38. Git의 내용 주소화 파일 시스템 살펴보기
    cat .git/objects/bc/e568648779a…

    View Slide

  39. 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

    View Slide

  40. Git의 내용 주소화 파일 시스템 살펴보기
    python3 unzlib.py .git/objects/bc/e56…

    View Slide

  41. Git의 내용 주소화 파일 시스템 살펴보기
    python3 unzlib.py .git/objects/bc/e56…

    View Slide

  42. Git Object
    ● Blob
    ● Tree
    ● Commit
    ● Tag
    구조
    <타입> <본문 길이>\x00<본문>

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  46. Git Object - 타입 얻기
    git cat-file -t bce5

    View Slide

  47. Git Object - 타입 얻기
    git cat-file -t bce5

    View Slide

  48. 자주 쓸 명령어
    find .git/objects -type f # git이 관리하는 object
    목록
    git cat-file -t bce5 # object 타입
    python3 unzlib.py .git/objects/../…
    # 압축만 풀고 살펴보기
    git cat-file -p bce5 # object를 읽기 좋게 표시

    View Slide

  49. Git Object - Tree
    ● Tree와 Blob을 배열의 형태로 가질 수 있음
    ● Tree와 Blob의 이름을 저장

    View Slide

  50. Git Object - Tree
    find .git/objects -type f

    View Slide

  51. Git Object - Tree
    find .git/objects -type f

    View Slide

  52. Git Object - Tree
    git cat-file -t 6a19

    View Slide

  53. Git Object - Tree
    git cat-file -t 6a19

    View Slide

  54. Git Object - Tree
    python3 unzlib.py .git/objects/6a/194…

    View Slide

  55. Git Object - Tree
    python3 unzlib.py .git/objects/6a/194…

    View Slide

  56. Git Object - Tree
    python3 unzlib.py .git/objects/6a/194…
    <타입> <본문 길이>\x00<본문>

    View Slide

  57. Git Object - Tree
    python3 unzlib.py .git/objects/6a/194…
    <타입> <본문 길이>\x00<본문>
    \x00
    \x00
    \x00

    View Slide

  58. Git Object - Tree
    git cat-file -p 6a19
    또는
    git ls-tree 6a19

    View Slide

  59. Git Object - Tree
    git cat-file -p 6a19
    또는
    git ls-tree 6a19

    View Slide

  60. Git Object - Tree
    (root)
    buzzvil
    6a19
    bce5

    View Slide

  61. 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

    View Slide

  62. Git Object - Tree in Tree
    find .git/objects -type f

    View Slide

  63. Git Object - Tree in Tree
    find .git/objects -type f

    View Slide

  64. find .git/objects -type f
    Git Object - Tree in Tree
    (root)
    jamsil
    buzzvil
    buzzvil
    6a19
    bce5

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  70. Git Object - Commit
    Git을 사용하면서 수시로 만드는 바로 그 commit을 나타내는 object

    View Slide

  71. Git Object - Commit
    Git을 사용하면서 수시로 만드는 바로 그 commit을 나타내는 object

    View Slide

  72. Git Object - Commit
    git cat-file -t 82a2

    View Slide

  73. Git Object - Commit
    git cat-file -t 82a2

    View Slide

  74. Git Object - Commit
    python3 unzlib.py .git/objects/82/a26…

    View Slide

  75. Git Object - Commit
    python3 unzlib.py .git/objects/82/a26…
    <타입> <본문 길이>\x00<본문>

    View Slide

  76. Git Object - Commit
    git cat-file -p 82a2

    View Slide

  77. Git Object - Commit
    git cat-file -p 82a2

    View Slide

  78. Git Object - Commit
    git cat-file -t 442d

    View Slide

  79. Git Object - Commit
    git cat-file -t 442d

    View Slide

  80. Git Object - Commit
    git cat-file -p 442d

    View Slide

  81. Git Object - Commit
    git cat-file -p 442d

    View Slide

  82. Git Object - Commit
    (root)
    jamsil
    buzzvil
    buzzvil
    bce5
    2ed8
    6a19
    bce5

    View Slide

  83. Git Object - Commit
    (root)
    jamsil
    buzzvil
    buzzvil
    bce5
    2ed8
    6a19
    bce5

    View Slide

  84. Git Object - Tag
    Git의 Tag는 2가지가 있다.
    ● Annotated Tag ← 커밋처럼 메시지를 남기고, 서명을 할 수 있는 태그, object
    ● Lightweight Tag ← 버즈빌의 대부분 태그

    View Slide

  85. Git Object - Tag
    git tag -a v1.0 -m "First version"
    git show v1.0

    View Slide

  86. Git Object - Tag
    git tag -a v1.0 -m "First version"
    git show v1.0

    View Slide

  87. Git Object - Tag
    find .git/objects -type f

    View Slide

  88. Git Object - Tag
    find .git/objects -type f

    View Slide

  89. Git Object - Tag
    find .git/objects -type f

    View Slide

  90. Git Object - Tag
    git cat-file -t 3f91

    View Slide

  91. Git Object - Tag
    git cat-file -t 3f91

    View Slide

  92. Git Object - Tag
    python3 unzlib.py .git/objects/3f/911…

    View Slide

  93. Git Object - Tag
    python3 unzlib.py .git/objects/3f/911…
    <타입> <본문 길이>\x00<본문>

    View Slide

  94. Git Object - Tag
    git cat-file -p 3f91

    View Slide

  95. Git Object - Tag
    git cat-file -p 3f91

    View Slide

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

    View Slide

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

    View Slide

  98. Git Object - Tag
    git cat-file -p company

    View Slide

  99. Git Object - Tag
    git cat-file -p company

    View Slide

  100. Git Object - Tag
    git cat-file -p company

    View Slide

  101. Git 의 계층 구조
    내용 주소화 파일시스템
    저수준 명령어 (Plumbing)
    고수준 명령어 (Porcelain)

    View Slide

  102. Git Object
    ● Blob
    ● Tree
    ● Commit
    ● Tag
    구조
    <타입> <본문 길이>\x00<본문>

    View Slide

  103. 자주 쓴 명령어
    find .git/objects -type f # git이 관리하는 object
    목록
    git cat-file -t bce5 # object 타입
    python3 unzlib.py .git/objects/../…
    # 압축만 풀고 살펴보기
    git cat-file -p bce5 # object를 읽기 좋게 표시

    View Slide

  104. 전체 그림
    Buzzvil\n
    6a19 bce5
    Initial
    commit
    Add
    Jamsil
    82a2
    442d
    parent
    tree
    tree
    2ed8
    company
    v1.0
    jamsil
    buzzvil
    buzzvil
    object
    object
    d837
    3f91

    View Slide

  105. Git 저장소 살펴보기
    tree .git

    View Slide

  106. Refs
    ● Symbolic Refs: HEAD, …
    ● 브랜치: master, …
    ● 태그: v0.0.1, …

    View Slide

  107. HEAD 살펴보기
    cat .git/HEAD

    View Slide

  108. HEAD 살펴보기
    cat .git/HEAD

    View Slide

  109. 브랜치 살펴보기
    cat .git/refs/heads/master

    View Slide

  110. 브랜치 살펴보기
    cat .git/refs/heads/master
    Add
    Jamsil
    82a2
    442d
    parent
    tree
    2ed8
    company
    v1.0
    jamsil
    buzzvil
    object
    d837
    3f91

    View Slide

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

    View Slide

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

    View Slide

  113. 브랜치 살펴보기
    git switch develop
    git show

    View Slide

  114. 브랜치 살펴보기
    git switch develop
    git show

    View Slide

  115. HEAD와 브랜치 살펴보기
    cat .git/HEAD

    View Slide

  116. HEAD와 브랜치 살펴보기
    cat .git/HEAD

    View Slide

  117. HEAD와 브랜치 살펴보기
    cat .git/HEAD

    View Slide

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

    View Slide

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

    View Slide

  120. 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

    View Slide

  121. 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

    View Slide

  122. 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

    View Slide

  123. 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

    View Slide

  124. Tag 살펴보기
    git tag v0.0.1 develop
    find .git/refs/tags -type f

    View Slide

  125. Tag 살펴보기
    git tag v0.0.1 develop
    find .git/refs/tags -type f

    View Slide

  126. Tag 살펴보기
    find .git/refs/tags -type f -print -exec cat {} \;

    View Slide

  127. Tag 살펴보기
    find .git/refs/tags -type f -print -exec cat {} \;

    View Slide

  128. 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

    View Slide

  129. 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

    View Slide

  130. 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

    View Slide

  131. 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…

    View Slide

  132. 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…

    View Slide

  133. 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

    View Slide

  134. 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

    View Slide

  135. 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

    View Slide

  136. 전체 그림
    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

    View Slide

  137. .git 살펴보기
    tree .git

    View Slide

  138. .git 살펴보기
    tree .git

    View Slide

  139. index 살펴보기
    git status
    xxd .git/index

    View Slide

  140. index 살펴보기
    git status
    xxd .git/index
    https://mincong.io/2018/04/28/git-index/

    View Slide

  141. 참고 자료
    ● 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/

    View Slide

  142. 감사합니다.
    cd .. && rm -rvf git-internal

    View Slide