본 글은 아래 글의 내용을 상당 부분 인용하고 있습니다.
https://github.blog/2020-12-17-commits-are-snapshots-not-diffs/
- Object 가 뭘까?
- blob 이란 무엇일까?
- Tree 의 정체는?
- commit 은 도대체 뭘까?
- branch 는 무엇일까?(Head 는 무엇일까?)
- 두 커밋의 차이는 어떻게 비교할 수 있을까?
- patch 는 무엇일까?
- cherry pick 은 무슨 일을 하는가?
- rebase 는 무슨 일을 하는가?
git rev-parse
git cat-file
rev-parse 에서 rev 란 revision 의 준말로 일반적으로 SHA1 hash 를 뜻한다고 한다.
hash 와 관련된 용어겠구나 라고 생각하면 된다. 이 명령어를 사용하면 Object 의 hash 값을 얻을 수 있다.
cat-file 을 이용하면 object 의 타입이나 내용에 대해서 알 수 있다.
*) rev-parse 가 하는 일 https://stackoverflow.com/questions/15798862/what-does-git-rev-parse-do
저장소를 시작하자.
그 후에 hello.txt 파일을 만들고 hello 라고 입력한후에 저장한다.
그리고 커밋!
git init .
echo hello > hello.txt
git add hello.txt
git commit -m first commit
그 후에 .git 디렉토리를 살펴보자.
여러가지 디렉토리가 생긴것을 볼 수 있다.
git cat-file -p <oid>
커맨드를 이용하면, object 의 내용을 확인할 수 있다.
git cat-file -p <oid>
명령을 통해서 object 의 내용을 읽을 수 있다.
blob 은 파일의 내용이다.
파일 시스템에서의 디렉토리. 파일이름과 파일내용의 hash(blob) 을 가지고 있다.
파일 시스템 상태에 대한 스냅샷이다. 따라서 root Tree 의 hash 를 가지고 있다.
추가적으로 버전 컨트롤을 위해서 부모 커밋의 hash 도 가지고 있다. 커밋메세지 및 작성자 등 커밋 메타 정보 또한 가지고 있다.
착각하기 쉬운 것이 commit 이 차이라고 생각하는 것이다. 하지만 우리가 보게되는 차이는 두개의 스냅샷간의 차이를 tree 순회 를 통해서 계산한 것
이다.
branch 는 commit 에 대한 포인터다.
commit 이란 무엇일까
의 대답참고
(추가적으로 정리가 필요하다)
git cherry-pick <commit-id>
를 사용하면, HEAD 가 있는 커밋과 cherry-pick 대상의 공통의 부모를 고른다. 해당 부모와 대상의 차이를 계산한다. 그 후에, 차이를 현재 HEAD 에 반영한다.
cherry-pick 과 유사하다. 차이는 rebase 를 하면, 공통 부모로 부터의 모든 커밋이 새로운 베이스 위로 복사된다는 점이다.