기록방

GIT - git의 원리 [생활코딩] 본문

CS/Git

GIT - git의 원리 [생활코딩]

Soom_1n 2021. 5. 28. 00:11

● gistory 설치

[ git의 원리 파악하기 ]

원리를 파악하기위애 .git의 파일이 내부에서 어떤 변화가 있는지 알아보자.

git을 쉽게 분석하기위해 만든 프로그램이 gistory임.

웹에서 돌아가고, .git디렉토리에 있는 내용들을 리스트로 보여줌.

파일이 변경되거나 추가되면 가장 위쪽으로 옴.

 

방금 내린 명령이 어떤 파일에 영향을 주었고, 어떤 내용인지 파악 및 추적 가능.

 

[ gistory ]

파이썬 설치 후

'pip install gistory' (혹은 pip3)로 설치

 

여기서 pip버전이 맞지 않아 오류가 뜸.

pip help를 쳐보니 버전 확인(pip -V)만 있고 업글하는 방법은 없었음..

 

검색해보니

python -m pip install --upgrade pip

라고 치면 업그레이드 됨.

 

gitfth2 폴더에 init을 쳐서 .git 디렉토리를 만들어주고 gistory를 입력하니 오류가 뜸.

cd .git으로 깃디렉토리 안에서 gistory를 하니 해결.


git add의 원리

git add했을때 어떤 일이 내부적으로 일어나는지 알아보자.

 

[ 별도의 저장소 만들기 ]

mkdir gitfth2

별도의 저장소 생성

git init

.git이라는 디렉토리 생성

cd .git

.git안에 어떤 파일들이 있는지 확인가능.

 

여기서 원래 gistory를 실행해야하지만 어쩐 일인지 잘 되지않음.

그래서 cmd - .git까지 들어오기 - gistory실행 하면 localhost:8805가 웹브라우저에서 켜짐.

 

어차피 gistory 실행하면 탐색기를 다시 켜줘야하므로 gistory는 cmd로, 나머지는 git bash로 보자.

(gistory끄고싶으면 Ctrl + c.)

 

[ 파일추가 ]

vim f1.txt

f1.txt만들고 내용은 'a' 입력

 

gistory를 새로고침해보면 ... 아무런 변화 없음.

파일 추가에 대해서는 git이 아무런 관여를 안하기 때문.

 

git add f1.txt

add한 이후 (여기서 f1.txt가 이미 있어서 경구문구 나옴 - 무시.)

gistory를 새로고침하면 object어쩌구와 index 파일이 변화했음.

 

내용을 보면 object(객체)에는 파일의 내용이, index에는 파일의 이름이 쓰여있음.

index에는 객체의 아이디가 적혀있는데 누르면 바로 객체의 내용을 볼 수 있음.

 

vim f2.txt
git add f2.txt

파일을 하나 더 만들어서 add한 후 gistory를 보면 object가 하나 더생기고 index에도 추가됨.

 

[ 파일 볷사 ]

cp f1.txt f3.txt
git add f3.txt

f1.txt를 f3.txt로 복사한 후 gistory를 확인하면

object가 추가되진 않았고 index랑 같이 수정만 되어있음.

 

object를 보니 내용이 'a'로 똑같음.

index를 보니 f1.txt와 f3.txt의 객체 아이디가 같음.

따라서 같은 오브젝트를 가리키고 있음.

이게 상당히 중요한 부분임.

 

'git은 파일의 이름이 달라도 파일의 내용이 같으면 같은 오브젝트 파일을 가리킨다.' 라는 중요한 원리임.

내부 매커니즘 중 1번째 : 중복제거 원리임.

 

누가 언제 만들었뜬 강의를 보고 따라했다면 객체 내용이 같을때 객체 아이디가 같음...

어떻게 가능한지는 다음 강의에서.


objects 파일명의 원리

git의 중요한 원리인 '내용이 같으면 파일명이 같다'를 알아보자.

 

[ sha1 online ]

구글에서 검색해 가장 첫 번째 사이트를 들어가서 아무거나 입력해보자.

 

'sha1'이라는 해시 알고리즘을 통해 일정한 크기의 문자열을 반환함.(해시값)

object 디렉토리에 해시값의 앞 2글자 이름을 따서 디렉토리를 하나 만들고,

그 안에 나머지 해시값을 파일명으로 저장함.

 

실제로는 git이 sha1을 내부적으로 사용하긴하지만,

내용 외에 부가적인 정보도 넣으므로 해시값은 사이트와 달라짐.

아무튼 원리는 이렇다.


commit의 원리

add원리를 알아봤으니 commit의 원리도 알아보자.

 

[ 상태 확인 ]

git status

f1.txt, f2.txt, f3.txt 세 파일이 뉴 파일 상태로 나와있음.

 

[ 버전 만들기 ]

git commit

커밋 이후 gistory 확인.

 

가장 최근 파일이 5개 수정됐고, 그 전에도 몇 개 수정되어있음.

 

5개중 object파일을 보면 commit할때 남겼던 commit 메세지가 저장되어 있음.(커밋도 객체라는걸 알 수 있음)

트리라는 단어 옆에 객체 아이디가 또 나와있음.

해당 객체로 가보니 commit했던 f1.txt f2.txt f3.txt의 객체 아이디와 파일명이 적혀있음.

 

다시말해 commit하면, 그 버전은 오브젝트파일로 저장되고 트리가 저장되는데,

그 트리에는 현재 버전에 해당되는 파일의 이름과 내용이 링크되어 있음.

 

[ 버전을 한 번 더 만들기 ]

버전을 한 번 더 만들고 commit 오브젝트를 보면 parent라는게 생겨나있음.

확인해보면 전 버전의 tree임. 수정 전의 버전 내용이 담겨있음.

현재 버전의 tree를 보면 수정된 버전 내용이 담겨있음.

 

정리하면 commit에는 중요한 정보가 2개있음.

이전 commit이 누구인가 하는 parent정보가 있고,

또 하나는 commit이 일어난 그 시점의 작업 디렉토리의 이름과 내용이 tree에 담김.

따라서 각각의 버전마다 서로 다른 tree를 가리키고있음.

이 tree를 commit했을때 해당 디렉토리를 사진찍었다고 표현함.

 

다시 정리해서 object파일은 3가지로 나뉨

1. 파일의 내용 : blob

2. 파일 블록의 정보 : tree

3. commit의 내용 : commit


status의 원리

(status 내부 활동 짐작 : 소스코드를 본게 아니라서 틀릴 수 있음)

 

[ git status ]

git status 를 쳤을때 commit할 게 있는지 없는지 어떻게 파악할 수 있을까.

 

index파일과 가장 최신 commit 오브젝트의 차이를 비교하면 commit할게 있는지 없는지 알 수 있음.

add하면 index의 해당파일 내용이 바뀜.

commit하면 index의 내용이 레파지토리에 저장됨(commit 오브젝트 생성)

 

(윈도우 운영체제에서 리눅스나 유닉스 처럼 명령어로 프로그램을 다룰 수 있게 됨)

"git" 명렁어 쳐서 잘 설치되었나 확인해보기

 

[ 정리 ]

지금까지 .git이 있던 폴더 이름은 working directory라고 부를 것.

 

1. working directory - index

2. stage area

3. cache - repository

 

이 세 가지의 기능을 내부 동작을 통해 알아보았음.

 

끝.

728x90