이 글을 읽어보시기 전에 이전 글을 읽어보시는 것을 추천합니다.
🧑🏻💻 git commit
개발자라면 모를 수 없는 git commit! 이전에는 git add를 하면 어떠한 일이 일어나는지 살펴보았다면 이번에는 그다음단계인 git commit을 하게 된다면 어떤 일이 일어날지에 대해서 알아보자.
😎 실습
역시 뭐니 뭐니 해도 실습이 최고다.
🤔 현재 상황
저번에 했던 간단한 프로젝트에 이어서 진행하도록 하겠다. 아래와 같이 foo.txt, boo.txt가 있는 간단한 구조이고 내용은 a, b이다.
.git 파일은 아래와 같이 구성되어 있다. 78이 foo.txt, 63이 boo.txt의 내용을 가지고 있는 object라고 보면 될 것 같다.
📸 커밋하기
커밋메시지는 아주 간단하게 1로 하고 커밋을 했다.
🧐 변경된 파일은 뭐가 있을까?
이제 좀 복잡해진다. 우선 object폴더에 5d, 60 폴더가 생성된 것이 눈에 띈다. 또한 COMMIT_EDITMSG라는 파일이 생겼다. logs라는 폴더도 생겼다.
index의 경우 그대로 유지가 되어있는 것을 알 수 있다.
📁 object폴더 살펴보기
너무 깊게 들어가는 것보다 아주 간단하게 살펴볼 예정... (내가 모른다) 우선 60어쩌구로 되어있는 폴더를 열어 파일을 열어볼까...?
일반적인 방법으로는 열 수 없고, git cat-file -p를 통해 열 수 있다.
tree 5d5b24b33c7a576090b454ce38776ebbcd52dd4b
author hyunjuntyler <hyunjun1994@hanyang.ac.kr> 1734674964 +0900
committer hyunjuntyler <hyunjun1994@hanyang.ac.kr> 1734674964 +0900
1
살펴보면... 아주 심플하게, 해시값을 가지고 있는 트리, 커밋한 사람, 커밋 메시지가 저장되어 있는 것을 볼 수 있다.
엇 그런데 tree뒤에 있는 해시값이 좀 익숙하다? 바로 objects폴더에 생긴 파일과 이름이 같다. 5d5b...
이것도 열어보게 된다면...
100644 blob 63d8dbd40c23542e740659a7168a0ce3138ea748 boo.txt
100644 blob 78981922613b2afb6025042ff6bd878ac1994e85 foo.txt
드디어 등장한 blob 키워드! blob을 제외하고는 index와 유사하다. 결국 파일명과 object를 가리키고 있다.
🧐 중간 요약
결국 objects폴더 안에서 많은 일이 일어나고 있다. 폴더가 주르르륵 있지만 commit을 가리키고 있는 폴더, tree폴더, blob폴더가 있는 것이다.
logs → HEAD 파일을 보게 된다면 아래와 같이 현재 커밋인 6087 어쩌고 가 HEAD인 것도 볼 수 있다.
📂 파일을 폴더 안으로 옮기게 된다면?
위와 같이 폴더를 만들어서 파일을 옮기게 된다면 어떤 일이 일어날까? index부터 살펴보니
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 bar/foo.txt
100644 63d8dbd40c23542e740659a7168a0ce3138ea748 0 boo.txt
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 foo.txt
위와 같이 index가 변경되게 되고 commit을 하게 된다면...
위와 같이 objects에 많은 것들이 추가됨을 알 수 있다. HEAD를 통해 커밋을 담고 있는 object는 8f로 시작함을 알 수 있다.
커밋을 먼저 살펴보면 왜 내가 한 번 더 커밋을 했는지 알 수 있다. parent라는 것이 생겼다!
tree cb79cb5a930430a34621a3292ea2998bc2f0226e
parent 60871a6232068aa1d3065465af225cded13dd783
author hyunjuntyler <hyunjun1994@hanyang.ac.kr> 1734678728 +0900
committer hyunjuntyler <hyunjun1994@hanyang.ac.kr> 1734678728 +0900
2
tree와 함께 이전 커밋인 parent까지의 정보를 담고 있는 것을 확인할 수 있다. tree를 확인해 볼까?
040000 tree 06d5bfef666bd02e71819b25a4cfcaab360e22ee bar
100644 blob 63d8dbd40c23542e740659a7168a0ce3138ea748 boo.txt
100644 blob 78981922613b2afb6025042ff6bd878ac1994e85 foo.txt
이번에는 blob뿐이 아니라 tree안에 tree가 또 있다. 여기서 왜 이름이 tree인지 알 수 있게 되었다. 😊 폴더구조는 tree와 blob을 통해 관리된다.
트리를 다시 타고 들어가 보니 foo.txt의 blob파일을 가리키고 있다. 아래에서는 foo.txt파일이 옮겨갔으니 지워진 것으로 판단이 되는 것 같다. 그래서 이것도 커밋을 해주었다.
커밋의 tree를 타고 가 보면 tree, blob이 잘 되어있는 것을 볼 수 있다. 파일의 내용이 변경되지 않는 한 7898... 형식의 해시값은 일정하다.
🥸 추가 내용
슬슬 머리가 아파온다... 이것저것 테스트 해보았지만 그 뒤의 내용은 다른 사람이 읽을 수 없을 것 같다. 😇 예를 들면 파일을 변경하고 a라는 내용이 있는 파일이 남아있지 않더라도 아래처럼 7898... 의 a라는 내용을 담고 있는 blob은 여전히 남아있는 것도 확인할 수 있었다.
🥳 최종 결론
소스코드를 뜯어볼 수 없기 때문에 추측만 가능한 수준인 것 같지만... 최종 결론을 내려본다면...
commit을 하게 되면 objects폴더에 commit정보 tree정보를 담고있는 두 세트의 폴더, 파일이 생긴다. commit 정보에는 tree, parent, message가 있다.
✨ 중요한 내용
- commit, tree, blob모두 objects파일 안에서 관리된다.
- commit은 tree를, tree는 다른 tree나 blob을 가리키고 있다.
- commit에는 parent라는 부모 커밋의 해시값도 담고 있다.
- 최종적으로 파일의 내용을 담고 있는 object는 blob이다.
objects폴더만 본다면 아래와 같이 이루어져 있다는 것을 알 수 있다.
'→ Git의 원리' 카테고리의 다른 글
[Git] git add를 하면 어떤 일이 일어날까? (2) | 2024.12.20 |
---|