ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Git - 4.1 Git의 원리(add의 원리, object 파일명의 원리)
    STUDY/Git & Github 2021. 1. 4. 15:21

    #이 글은 "생활코딩" '프로젝트 관리' 강의를 기반으로 정리한 글 입니다. 

     

     

    이전까지의 글에서 Git의 기본적인 명령어에 대하여 알아보았습니다. 이번에는 앞서 살펴본 Git의 명령어들이 어떻게 동작하는 지에 대해 살펴보겠습니다. 강의에서 말하듯, 원리를 아는 것이 Git을 이해하는 데 큰 도움이 된다고 생각합니다. 

     

    본격적으로 Git의 원리에 대해 알아보기 이전에 Git 내부를 분석하는데 도움을 주는 도구, "Gistory"를 설치해줍니다.

     

    1. 파이썬 설치(파이썬 설치에 대한 내용은 따로 설명하지 않겠습니다.)

    2. pip로 설치 - Mac / Linux: sudo pip3 install gistory 

     

    Gistory 사용법

    1. .git 디렉토리로 이동

    2. $gistory

    3. 브라우저에서 "localhost:8805"

    4. 종료 시, ctrl + c 

     

    Git 동작 과정을 보는 동안 계속 Gistory 실행을 유지하고,  새로운 터미널 창을 열어 Git 명령어를 사용해야 한다.

    gistory 명령 실행 모습

     

    실습을 위한 준비가 끝났으니 이제 명령어를 하나 하나 실행하며, gistory를 통해 .git 디렉토리 내부의 변화에 대해 살펴보는 것을 통해 Git의 원리에 대해 알아보도록 하겠습니다. 우선 새로운 디렉토리를 생성하고, 이 디렉토리에서의 변화를 살펴보도록 하겠습니다. 

     

    * 실습 전 환경 셋팅

    우선 새로운 디렉토리를 Git의 저장소로 만들어주어야겠죠. git init 을 통해, git 저장소를 만들고 cd .git 을 통해 .git 디렉토리로 이동합니다. .git 디렉토리 내부에서 gistory 명령어를 통해 gistory를 실행시켜줍니다. 브라우저에서 local:8805 를 입력하고 새로운 터미널 창을 하나 더 띄워주면, 실습준비 완료입니다!

     

    Gistory 브라우저 실행 모습

     

    git add의 원리

     

    우선 이름은 f1.txt, 그 내용은 'a'인 파일을 하나 생성합니다. 그리고 git add를 해줍니다. 그리고 브라우저를 리프레쉬하면, 새로 생긴 두개의 디렉토리를 볼 수 있습니다. 바로 ./index./object 디렉토리 입니다. 

     

    f1.txt의 내용(왼) git add f1.txt(오)

     

     

    git add이후, 추가된 ./index , ./object 디렉토리

     

    ./index 에서 '78981912...'로 시작되는 경로를 누르면, ./object/78/981912... 가 링크로 연결되어있습니다. 

     

    ./objects/78/981922613b2afb6025042ff6bd878ac1994e85 에서

    앞의 /78 은 '디렉토리 명'

    뒤의 /981922613b2afb6025042ff6bd878ac1994e85 은 '파일 명' 입니다.

     

    즉, ./index 의 78981922613b2afb6025042ff6bd878ac1994e85 은 78 디렉토리의 981922613b2afb6025042ff6bd878ac1994e85 파일을 가리키고 있는 것입니다. 

     

    ./object/78/981912... 을 보면 (오른쪽 사진) 위에서 우리가 생성한 f1.txt의 내용이 담겨져있습니다. 

    ./index (왼) ./object(오)

     

     

     

    이번에는 이름은 f2.txt, 내용은 'z'인 파일을 하나 생성해줍니다. 그리고 똑같이 git add를 해주고, 브라우저를 리프레쉬 한 후 다시 변경사항을 확인해봅시다. 위에서와 같이, ./object가 생성되었고, add한 f2.txt에 대한 내용이 적혀있는 것을 볼 수 있습니다. 

     

    git add f2.txt 이후, gistory의 모습
    git add f2.txt 이후, ./index(왼), 새로 생성된 ./object/b6/80... (오)

     

     

    이를 통해, 우리가 git add 명령어를 수행하면, .git 디렉토리의 ./index 폴더에 우리가 add 한 파일의 정보가 기록되고, ./object/[디렉토리명]/[파일명] 에는 해당 파일의 정보가 저장된다는 것을 알 수 있습니다. 앞선 포스트에서, git add를 하면 변경된 내용을 실제 저장소에 저장(commit)하기 전에, 우선 대기 상태 공간(stage area)에 올려둔다는 것을 배웠습니다. 여기서 바로 이 './index' 디렉토리가 바로 그 '대기 상태 공간(stage area)'라고 할 수 있습니다.  

     

    _____________

     

    git add라는 명령어의 원리에 대해 조금씩 알아갈 수록 신기하지 않나요? 그렇다면 조금만 더 git add에 대해 알아봅시다! 

    이번에는 cp f1.txt f3.txt를 통해, f1.txt와 동일한 내용의 파일 f3.txt를 만들어줍니다. 그리고 이번에도 동일하게 git add f3.txt를 해줍니다. 그리고 gistory를 확인해보면 특이한 점을 발견할 수 있습니다. 

     

    이번에는 git add를 했는데도 불구하고, ./object 디렉토리가 새로 생성되지 않았습니다! 하지만 ./index 와 f1.txt add시 생성된 ./object/78/981922... 렉토리에 변경사항이 생겼습니다. 우선 ./ index를 살펴보면, 우리가 add한 f1, f2, f3.txt가 모두 추가되어 있는 것을 볼 수 있습니다. 

    하지만, 자세히 보면 f1.txt와 f3.txt 모두 78981922613b2afb6025042ff6bd878ac1994e85 로 동일한 object 파일을 가리키고 있습니다.  ./objects/78/981922... 를 보면, 아래에 f1.txt, f3.txt 두가지 파일명을 가지고 있는 것을 볼 수 있습니다. 

     

    여기서 우리는 git add의 중요한 원리에 대해 알 수 있습니다.

     

    git은 어떠한 파일을 저장할 때, 파일의 이름이 다르더라도 내용이 동일하다면, 동일한 object 파일을 가리킵니다. 즉, 내용이 같은 수많은 파일이 존재하더라도, 내용이 같으면 동일한 object를 가리키기 때문에, 이로 인해 발생되는 중복을 회피할 수 있다는 큰 장점이 있습니다!

     

    git add f3.txt 이후, gistory의 모습

     

    git add f3.txt 이후, ./index (왼)와 ./object/78/.. (오) 의 모습

     

     

    git add의 원리를 알고나니 더 git에 흥미가 생기지 않으신가요??  전 강의에서 왜 원리에 대해 알려주는지, 원리의 중요성에 대해 점차 알아가고 있는 기분인데, 이 글을 보는 다른 분들도 같은 마음이시면 좋겠습니다 ..ㅎㅎ

     

     

     

    지금까지 저와 같이 따라 실습을 진행하신 분들이라면 혹시 특이한 점을 하나 발견하신 분들이 있지 않을까 싶습니다. gistory의 ./index를 보시면, 내용이 'a'인 파일의 링크가 다들 78981922613b2afb6025042ff6bd878ac1994e85 이것이지 않으신가요? 모두 각자의 컴퓨터에서 실습을 했을텐데 어떻게 파일의 이름이 동일한 것일까요? 이것이 바로 다음에 배울 git의 원리인 'Object 파일명의 원리'입니다.

     

     

    Object 파일명의 원리

     

    링크는 해시함수에서 가장 많이 쓰이는 SHA알고리즘을 이용하여, 입력한 문자열을 해시함수로 변환해주는 사이트입니다.

     

    왜 object 파일명이 원리에 대해 이야기하다가 해시함수에 대해 이야기하냐, 바로 git의 object 파일도 이러한 해시함수이기 때문이다. Git은 데이터를 저장할 때 데이터와 헤더로 생성한 SHA-1 체크섬으로 40자 길이의 파일 이름을 생성합니다. 해시의 처음 두글자는 디렉토리 이름으로 사용하고, 나머지 38자는 파일 이름에 사용합니다. 이러한 방식으로 파일을 생성하기 때문에, 각기 다른 사용자가 동일한 내용의 파일을 생성하고 git에 저장하면, 동일한 이름의 object 파일명이 생성되는 것입니다.  

     

    참고로, 위에 링크 에서 'a'를 입력하고 나오는 해시값과 우리의 f1.txt, f3.txt의 object 파일명을 보면 동일하지 않은 것을 볼 수 있습니다. 그 이유는, git의 object 파일의 해시는 데이터 뿐 아니라 헤더 정보를 포함하는 해시이기 때문입니다.

     

     

     

     

    _________________

     

    생각보다 포스트가 길어져 이번 포스트에서는 git add와 object 파일명의 원리에 대해서만 알아보고,

    나머지 commit과 status의 원리는 다음글에서 이야기하도록 하겠습니다.

    감사합니다.

    댓글

Designed by Tistory.