수학과의 좌충우돌 프로그래밍

04. git의 원리(1) gistory와 add의 원리 본문

git

04. git의 원리(1) gistory와 add의 원리

ssung.k 2019. 2. 5. 03:32




안녕하세요 강민성입니다.


이번에는 git의 내부적인 원리를 알아보고자 합니다.


나중에 다시 소개하겠지만 이는 github 에서 저의 commit 수를 기록해주는 부분입니다.


github이라는 용어가 처음 나와서 소개를 하자면이 git 을 보조해주는 git 소스 저장소라고 생각하시면 됩니다.


물론 더 다양한 기능을 하고 복합적이지만 지금은 이렇게만 이해하시면 될 듯합니다.


어디 내놓기는 부끄럽지만 그래도 나름 git 을 써온다고 써왔지만


지금 까지 기계적으로 코드를 쳐왔습니다.


아마 많은 분들이 저와 같은 상황이라고 생각합니다.


이번 기회에 블로그 포스팅을 하면서 git 의 원리를 공부할 수 있어서 저에게도


좋은 기회가 되었습니다.


여러분도 원리를 알고 사용하시길 바랍니다.




git 의 원리



우리가 git 명령어를 입력하게 되면 우리 눈에는 보이지않는 숨겨진 폴더, .git 의 내용이


변하게 된다는 건 저번 시간에도 한 번 언급한 적이 있을 겁니다.


git 의 원리를 알기 위해서는 .git 내부적으로 어떻게 변하는지 알아야합니다.


하지만 매 순간 마다 어느 파일이 변하는지 확인하는 건 쉬운 일이 아닐 겁니다.


따라서 이를 보조해주는 프로그램을 설치 해보도록 하겠습니다.



gistory를 설치해보자



이름은  소제목 그대로 gistory 입니다.


gistory 는 파이썬으로 이루어져 있기 때문에 우선 파이썬을 설치해야합니다.


http://python.org/


파이썬 설치 후 pip 를 이용해서 다운받아줍니다.


pip 사용법은 어렵지 않으므로 안다는 전제하에 진행하겠습니다.


pip install gistory


설치가 완료되었다면 .git 폴더로 들어간 후


gistory

다음 명령어를 치면 서버가 열리는 걸 볼 수 있습니다.

써있는대로 http://0.0.0.0:8005/ 로 접속을 해보겠습니다.


왼쪽 메뉴바에는 .git 안에 더 세부적인 디렉토리가 표시가 되고 


클릭을 하면 그 안의 내용을 더 자세히 볼 수 있습니다.




git add의 원리를 알아보자



지금부터는 앞의 포스팅과 다른 디렉토리에서 실습을 진행하겠습니다.


앞의 내용을 복습하는 차원에서 한 번 훑어보자면


원하는 디렉토리로 이동 후,


mkdir git_principle    (git_principle 이라는 디렉토리 생성)


cd git_principle          (디렉토리 안으로 접근)


git init                        (git이 제어가능하도록 초기화)


cd .git                        (숨겨져있는 .git 디렉토리 안으로 접근)


gistory                       (gistory 실행)


http://0.0.0.0:8805/ 그 후 열린 서버로 접속하면 gistory 를 볼 수 있을겁니다.


(원인은 모르겠지만 .git 디렉토리 내부가 아닌 그 바깥 디렉토리에서  gistory명령어가


잘 작동하는 경우도 있었습니다. 운영체제의 차이인지 어떤 차이인지는 아직 모르겠으나


안된다면 댓글로 남겨주시길 바랍니다.)

현재 terminal에서는 서버가 돌아가고 있으므로 다른 명령어를 입력할 수가 없습니다.


다른 terminal을 하나 더 실행시켜 사용하도록 하겠습니다.



먼저 a 라는 내용을 가진 test.txt 파일을 하나 생성해보도록 하겠습니다.


아직까지는 gistory에 아무런 변화가 없습니다.


이번에는 이 파일을 add해보도록 하겠습니다.


(그 동안 계속 해서 써왔던 명령어들은 terminal 창을 생략해도 될 것 같습니다.


앞선 내용을 참고해주세요 ! 


https://ssungkang.tistory.com/entry/02-git-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EB%B2%84%EC%A0%BC%EA%B4%80%EB%A6%AC%EC%A0%80%EC%9E%A5%EC%86%8C-%EB%A7%8C%EB%93%A4%EA%B8%B0-add-commit)


add 한 결과, 2개의 파일이 변경되어 상단으로 올라왔고 최신화된 시간이 변경되었습니다.

먼저 objects 폴더부터 살펴보겠습니다.


그 안에는 78이라는 디렉토리가 만들어졌고


 그 안에 다시 숫자와 영문조합의 이름을 가진 파일이 생성되었습니다.


그 파일 속 내용은 a 로 방금 add 한 test.txt 파일과 내용이 일치합니다.

이번에는 index 파일을 살펴보겠습니다.


파일 안에는 역시나 영문과 숫자의 조합으로 이루어져있는 내용이 들어있습니다.


눈썰미가 좋으신 분들은 눈치를 챘겠지만


objects 폴더 안에 있는 또 다른 디렉토리와 그 안의 파일 이름과 동일합니다.


즉 index 파일에서 이름을 지정하고 그 이름을 objects 에서 찾으면 그 안에 파일의 내용이 담겨있는 구조입니다.

다음으로는 z 라는 내용을 가진 test2.txt 를 만들어 add 해보겠습니다.


이번에도 index와 objects 가 변했고


index 안에는 파일의 이름이,

objects 안에는 index에서 지정한 이름이 앞 두 글자는 디렉토리로,


앞 두 글자를 제외한 나머지 부분은 파일의 이름으로 저장된 걸 볼 수 있습니다.


물론 이 안에 test2.txt 의 내용인 z가 담겨있습니다.

이번에는 조금 다르게 test.txt 를 복사해서 test3.txt 라는 이름의 파일을 만들어주었습니다.


복사하였으므로 당연히 안의 내용은 동일합니다.


변경 사항을 확인해보면, 마찬가지로 index와 objects가 변했습니다.


하지만 앞과는 조금 다른 점이 있습니다.


먼저 index에 test3.txt 에 해당하는 숫자,영문 조합이 생겼는데


이는 test.txt에 대응되는 것과 동일합니다.

objects 는 최신화만 되었지 실질적인 내용은 바뀌지 않았습니다.

여기서 한 가지 짚고 넘어가자면 objects 폴더 안에 있는 파일들을 객체라고 부릅니다.


그러면 test.txt 와 test3.txt 는 파일의 이름이 다르지만 같은 객체를 가르킵니다.


그 이유는 파일의 내용이 같기 때문입니다.


이는 다른 로컬에서 다른 사용자가 확인해도 같은 파일이름이 생성이 됩니다.


그 이유를 알아보도록 합시다.




objects 속 파일 이름 속 비밀은?



git 은 파일의 내용을 가지고 암호화 과정을 거칩니다.


sha1 hash 라는 암호화 과정인데 어떻게 암호화 하는지는 모르셔도 무방합니다.


예를 들어 a 에 대한 암호화 값은 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8


다음과 같습니다.


여기서 앞의 두 글자를 따서 objects 내 디렉토리 이름을, 나머지 부분이 파일 이름을 결정합니다.


하지만 아쉽게도 위에서 본 것과 약간의 차이가 있습니다.


그 이유는, 파일의 내용 외에도 몇몇 부가적인 정보도 함께 암호화 하기 때문인데


이렇게 세부적인 부분보다는 전체적인 과정에 초점을 맞추시면 되겠습니다.




마무리


아무래도 원리를 설명하다 보니 내용이 길어지고 어려워는 듯 합니다.


하지만 원리를 알고 쓰는 것과 그렇지 않은 것은


앞으로 사용하는데 있어 많은 차이가 있을 겁니다.


모르는 부분은 댓글로 남겨주시면 함께 고민하면서 해결해보도록 하겠습니다 :)

Comments