생활코딩 Git 02 - git의 원리 (gistory, git add, git commit, git status)
10 Feb 2019 | Git분석도구 gistory
gistory는 git을 분석하기 위한 도구입니다. 명령을 내렸을 때 git의 내부에서는 어떤 일이 일어나는가를 분석하면서 git이 어떻게 동작하는가를 스스로 공부하는데 도움을 드리기 위해서 고안된 도구입니다.
pip install gistory
: gistory 설치 (파이썬이 설치되지 않은 경우, 파이썬을 추가 설치할 것)
git
으로 관리하고 있는 디렉토리가 아니라 버전 관리에 대한 정보가 들어있는 .git
폴더내에서 실행을 해야 제대로 작동이 된다. 혹시, 작동이 안되는 경우 파이썬을 환경변수로 등록하도록 하자.
http://localhost:8805/
: gistory 접속
#git 디렉토리에서 실행할 경우
$ gistory
Please execute in .git directory. (.git ▒▒▒丮▒▒ ▒̵▒▒▒ ▒Ŀ▒ ▒▒▒▒▒▒▒ּ▒▒▒)
#.git에서 실행할 경우
$ gistory
Bottle v0.13-dev server starting up (using WSGIRefServer())...
Listening on http://0.0.0.0:8805/
Hit Ctrl-C to quit.
git add의 원리
- 파일을 생성해도 gistory에는 아무런 변화가 없음. 파일 생성에는 git은 아무런 관여를 하지않음.
git add
시,.\index
와\objects\
가 gist에 새로 생성됨.- 파일의 이름은 index에 담겨지고, 파일의 내용은 objects에 담겨짐.
- objects에 담겨있는 파일을 object 또는 객체라고 부름
- git은 어떠한 파일을 저장할 때, 파일명이 달라도, 내용이 같으면, 같은 object 파일을 가리킴
- 이는 중복을 제거해 줌.
objects 파일명의 원리
- git add의 원리: 내용이 같으면 파일의 이름이 같다. 내용을 기반으로 해서 파일의 이름이 결정되는 매커니즘
- SHA1 해쉬 알고리즘 (http://www.sha1-online.com/)
- 특정한 텍스트를 입력하면 SHA1 해쉬 알고리즘을 통해 어떠한 일정한 길이의 텍스트가 출력됨
- hello : aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
- hi: c22b5f9178342609428d6f51b2c5af4c0bde6a42
- hello라는 정보가 담긴 파일의 내용을 git으로 관리한다고 가정하면,
SHA1 해쉬 알고리즘을 통해 결과값을 도출하며, 결과값에서 앞의 2글자(aa)를 떼서 objects 디렉토리 밑에 새로운 디렉토리를 만들고, f4~fd로 끝나는 파일을 만들어서 그안에 hello라는 정보를 저장함.
- hello 라는 정보는 objects/aa/f4c61ddcc5e8a2dabede0f3b482cd9aea9434d 파일에 저장됨.
- 어떠한 파일에 대하여 git add를 하게 되면,
- git은 사용자가 add 한 파일의 내용(예; a) 을 살펴 봄.
- a 라는 정보와 부가적인 정보를 추가해서 압축함
- 압축한 결과를 SHA1 해쉬 알고리즘 통해 hash 결과 값을 도출 함.
- 그 값에 해당 하는 디렉토리와 파일을 objects 라는 디렉토리 안에 만들고, 그 안에 a라는 정보를 저장함
- 마지막으로, index 파일 내에 파일 명과 내용에 대한 hash 결과값을 적음
git commit의 원리
- commit 메세지에 해당 하는 정보가 objects 라는 디렉토리안에 저장됨.
- commit(버전)도 파일의 내용처럼 objects 안에 들어감 => 내부적으로 commit 도 object(객체)라 할 수 있음.
Commit의 2가지 주요 정보
- parent: 이전 commit이 누군지? 부모를 나타냄
- tree: 커밋이 일어난 시점에 우리의 작업 디렉토리의 파일의 이름과, 파일의 이름이 담고 있는 내용 사이의 정보
- 각각의 버전마다 서로 다른 tree를 가르키며, 각 tree에는 우리가 작성한 버전에 해당되는 파일의 이름과 내용이 링크로 연결되어 있음
- 이 버전에 적혀있는 트리를 통해서 버전이 만들어진 시점에 대한 프로젝트 상태를 얻을 수 있음
- 사진을 찍었다 라는 표현으로 snapshot이라하며, snapshot을 트리라는 정보구조를 통해 가지고 있음.
- object 디렉토리안에는 object 파일이 들어가며 다음과 같이 3가지로 분류됨
- blob: 파일의 내용을 담고있음
- tree: 디렉토리의 파일 명과 파일명에 해당하는 내용(blob)의 정보를 담고있음
- commit: commit에 대한 정보가 담김 (parent, tree, comitter, commit id)
- 새로운 폴더(디렉토리)를 생성할 경우, blob이 아니라 tree로 분류됨.
#gistory 내 commit 에 대한 정보 예시
[commit] eb8cb46ecfdcdc2179b3c9a5422688eaf66856ff
tree 8cd9d220808a510fe08a61971b4e5cf12f44703f
parent c9a84bd28476612639770ada21fe9d89b7737007
author Harry Lee <tothefullest08@gmail.com> 1549785964 +0900
committer Harry Lee <tothefullest08@gmail.com> 1549785964 +0900
2
#tree 클릭시,
[tree] 8cd9d220808a510fe08a61971b4e5cf12f44703f
100644 blob fa2470945e46b80e026b5307755a1d37fecad10c f1.txt
100644 blob 6b7ebdabbd56bc8a06c9c80573229b9b498783a5 f2.txt
100644 blob fa2470945e46b80e026b5307755a1d37fecad10c f3.txt
#tree - f2. txt
[blob] 6b7ebdabbd56bc8a06c9c80573229b9b498783a5
y
z
f2.txt (This information was not included the original message)
#parent 클릭시,
[commit] c9a84bd28476612639770ada21fe9d89b7737007
tree 10b8459ff150b8007786afc917a22e8d81c77f85
author Harry Lee <tothefullest08@gmail.com> 1549785598 +0900
committer Harry Lee <tothefullest08@gmail.com> 1549785598 +0900
1
#parent의 tree 클릭 시,
100644 blob fa2470945e46b80e026b5307755a1d37fecad10c f1.txt
100644 blob ab9a1ea4c48eaa0b52c8b1fb5818488198ab1c0a f2.txt
100644 blob fa2470945e46b80e026b5307755a1d37fecad10c f3.txt
#parent - tree - f2.txt 클릭시,
[blob] ab9a1ea4c48eaa0b52c8b1fb5818488198ab1c0a
z
git status의 원리
해리@DESKTOP-8D71JEB MINGW64 ~/gitfth2 (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: f2.txt
no changes added to commit (use "git add" and/or "git commit -a")
- git은 아래의 두 정보를 서로 비교하여, 파일이 수정되었거나 변경되었는지의 여부를 git status로 알려줌.
.\index
파일에 나타나는 정보 (파일명과 내용; hash id)- workspace 안 파일의 내용
git add .
한 이후git status
는 아래와 같이 변경됨.Changes not staged for commit
=>Changes to be committed
git add
시, 변경된 정보는 index (staging area) 파일에 저장되며, commit 대기상태가 됨git commit -m '메세지명'
=> 새로운 commit 에 대한 object가 생성됨- 새로운 commit object의 tree 내용과 index의 내용은 일치하게 됨
- 더 나아가, workspace & staging area(index) & local repository 가 일치하므로,
git status
를 할 경우, git은 “nothing to commit” 라는 결과를 보여줄 수 있게 됨.
- Working Directory (work space): 작업할 파일이 있는 디렉토리입니다.
- Staging Area (index, cache) : 커밋을 수행할 파일들이 올라가는 영역입니다.
- Git Directory: Git 프로젝트의 메타 데이터와 데이터 정보가 저장되는 디렉토리입니다. 출처: https://ndb796.tistory.com/187 [안경잡이개발자]
Comments