티스토리 뷰

파일 수정 부터 add, commit 까지의 세부 동작을 알아보자(맥환경)

 

 

 

먼저 디렉토리를 만든 후 git init 을 하자

 

 

 

 

find .git 을 하면 git 의 구조를 볼 수 있다.

현재는 index 는 보이지 않고 objects 만 보인다.

왜냐하면 git 디렉토리에 아직 아무런 변경 사항이 없기 때문이다.

 

 

echo "test" > test.txt.    로 파일을 만들고. 

git add test.txt 로 stage에 올리게 되면

index 에서 앞으로 git 에서 변경이 일어나는 모든 파일을 추적하여 기록한다.

 

 

 

 

 

 

 

find .git 으로 확인 해 보자

 

 

위의 그림에서 확인 할 수 있는 것은

git add 를 하면 2가지가 생성 된다.

- object(blob)

- index

 

이게 무엇일까?

복잡하게 설명하면 한도 끝도 없다.

 

1. 일단 index 부터 살펴 보자

 

.git/index (git add 했을 경우)

Head: master (현재 git이 master 브랜치를 가르킴)

Staged 인 파일 목록

 

을 확인 할 수 있다.

 

 

.git/index (새로운 파일이 추가 되었을 경우)

 

 

여기까지 알 수 있는 건 

index에는

파일명 기준으로

파일 추가, 수정 또는 add 했을때 추적 하여 업데이트 된다는 것이다.

 

 

 

commit 할 경우는 어떻게 될지 보자

 

 

 

 

.git/index (커밋 한 경우)

 

커밋이 되면서

stage(1)

text.txt

가 지워졌다.

 

commit 까지도 index에 업데이트가 된 다는 것을 알았다.

 

 

 

2. 그럼 objects 를 살펴보자.

objects 는  SHA1 해시값을 가진 트리, blob, commit 객체로 구성된다.

구조는 보통 아래와 같다.


 

그러면 좀 전에 우리가 "test" 컨텐츠를 가지고 있는 text.txt 를 생성 했는데

왜 objects 아래에 해시값이 1개 밖에 없을까?


(objects 아래에 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 값을 가진 객체가 한개 밖에 없다.)

해시값은 디렉토리값부터 시작한다(9d/...)

 

 

거기다가 저 객체가 트리인지 blob 인지 커밋인지 알기 위해 아래와 같은 명령어가 필요하다.

 

 

"test" 가 출력 되는 것으로 보아 컨텐츠를 가리키는 blob 객체 다.

그러면 커밋객체는 커밋을 아직 안해서 없다는 건 알겠는데

트리 객체는 어디에 있을까?

 

blob를 가리키는 트리 객체를 만들기 위해서는 2가지 방법이 있다.

1. "git write-tree" 를 실행 한다.

- 이 방법은 딱 트리까지만 만들어 준다.

2. "git commit" 을 실행 한다

- 이 방법은 트리객체와 함께 해당 트리를 가리키는 커밋객체도 만들어 준다.

 

 

 

 

1번 부터 보자

 

 

 

 

 

 

 

 

트리를 생성하고 해당 트리객체를 살펴 보니

우리가 만들었던 blob 객체를 가리키고 있는 것이 보인다.

 

 

.git/objects 에는 어떻게 나올까

 

"2b297e643c551e76cfa1f93810c50811382f9117" 값을 가지는 트리객체가 생겼다.

 

우리가 생각하는 트리형태의 디렉토리로 구성이 되어 있지 않고,

같은 뎁스에서 생성 되기 때문에 헷갈리 수 있다.

하지만 커밋, 트리, blob 모두 같은 뎁스에 생성 된다.

 

 

 

2번을 보자("git commit" 을 실행 한다)

 

 

커밋을 실행 하면 트리가 만들어짐과 동시에

"ad0dbd0ba2cfd3f39eb3d11bc8c6d44f996ac6f2" 해시값을 가지는 커밋 객체가 생성 된다.

 

 

git log -p 로 커밋 로그를 보자

이 해시값이 우리가 맨날 커밋하고 나서 보는 그 해시 값이다.

 

 

 

git cat-file -p ad0dbd0ba2cfd3f39eb3d11bc8c6d44f996ac6f2 를 실행해서 살펴보자

 

1번에서 보았던 트리객체를 가리킨다.

 

 

 

blob, tree, commit 객체가 어떻게 생성 되었는지 그림으로 다시 한번 보자

 

실제로는 이것보다 훨씬 복잡한 구조 일 것이다.

 

 

시간이 생기면 좀 더 복잡한 구조로 해서 블로깅을 해봐야 겠다.

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday