티스토리 뷰
파일 수정 부터 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 객체가 어떻게 생성 되었는지 그림으로 다시 한번 보자
실제로는 이것보다 훨씬 복잡한 구조 일 것이다.
시간이 생기면 좀 더 복잡한 구조로 해서 블로깅을 해봐야 겠다.