저번에는 ADD로 Blob개체를 생성하는 것까지 보았다. 오늘은 COMMIT을 구현해보도록 하자!

그 전에 우리가 알고 있는 것이 있다. 커밋은 이전 커밋을 가리키고 있다. 오! 이것을 잘 생각해보자

먼저 익숙해져야하는 것이 있다. 깃은 모든것을 Tree와 Blob으로 저장한다는 것이다. Blob은 저번에 알아보았고 그럼 Tree에는 무엇이 있을까? 다음은 트리를 나타내는 그림이다. 잘 살펴보자! 트리는 Blob과 또다른 트리로 이루어져있다. 이 느낌을 잘 살려야한다.

밑의 명령어는 master브랜치가 가르키는 Tree개체를 의미한다.

$ git cat-file -p master^{tree}
100644 blob a906cb2a4a904a152e80877d4088654daad0c859 README
100644 blob 8f94139338f9404f26296befa88755fc2598c289 Rakefile
040000 tree 99f1a6d12cb4b6f19c8655fca46c3ecf317074e0 lib

Untitled

자! 그러면 커밋을 구현해보자. Git은 일반적으로 Staging Area(Index)의 상태대로 Tree 개체를 만들고 기록한다. 현재 스테이지 장소에 Blob들이 있다고 가정하면 그때 git write-tree를 쓰면 그것들을 트리로 만든다. 이때 파일 이름을 알게된다.

  $ git write-tree
	  0155eb4229851634a0f03eb265b69f5a2d56f341
  $ git cat-file -p 0155eb4229851634a0f03eb265b69f5a2d56f341
	  100644 blob fa49b077972391ad58037050f2a75f74e3671e92      new.txt
	  100644 blob 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a      test.txt

재미난 걸 해보자! 처음에 만든 Tree 개체를 하위 디렉토리로 만들 수 있다. git read-tree 명령으로 Tree 개체를 읽어 Staging Area에 추가한다. --prefix 옵션을 주면 Tree 개체를 하위 디렉토리로 추가할 수 있다.

  $ git read-tree --prefix=bak d8329fc1cc938780ffdd9f94e0d364e0ea74f579(다른트리)
  $ git write-tree
  3c4e9cd789d88d8d89c1073707c3585e41b0e614
  $ git cat-file -p 3c4e9cd789d88d8d89c1073707c3585e41b0e614
		040000 tree **d8329f**c1cc938780ffdd9f94e0d364e0ea74f579 bak
		100644 blob fa49b077972391ad58037050f2a75f74e3671e92 new.txt
		100644 blob 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a test.txt

커밋 개체는 commit-tree 명령으로 만든다. 이 명령에 커밋 개체에 대한 설명과 Tree 개체의 SHA-1 값 한 개를 넘긴다. 앞서 저장한 첫 번째 Tree를 가지고 아래와 같이 만들어 본다. 이게 커밋이다!!

  $ echo 'first commit' | git commit-tree **d8329f**
  fdf4fc3344e67ab068f836878b6c4951e3b15f3d

물론 위의 명령을 실행한 시간이나 Author 정보가 다르기 때문에 Hash 값은 다를 것이다.

  $ git cat-file -p fdf4fc3
  tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579
  author shinhyogeun <[email protected]> 1243040974 -0700
  committer shinhyogeun <[email protected]> 1243040974 -0700

이어서 두번째 커밋을 만들어보자! 이것은 2번째 커밋을 만들면서 첫번째 커밋트리를 쳐다보게 하는 것이다.

  $ echo 'second commit' | git commit-tree 3c4e9c -p fdf4fc3
  cac0cab538b970a37ea1e769cbbde608743bc96d