커밋은 snapshot 이다, diff 가 아니라.

Jin·2021년 1월 6일
0

본 글은 아래 글의 내용을 상당 부분 인용하고 있습니다.
https://github.blog/2020-12-17-commits-are-snapshots-not-diffs/

풀어야할 질문들

파일시스템으로서의 깃

  • Object 가 뭘까?
  • blob 이란 무엇일까?
  • Tree 의 정체는?

버전 컨트롤로서의 깃

  • commit 은 도대체 뭘까?
  • branch 는 무엇일까?(Head 는 무엇일까?)
  • 두 커밋의 차이는 어떻게 비교할 수 있을까?

깃 명령의 이해

  • patch 는 무엇일까?
  • cherry pick 은 무슨 일을 하는가?
  • rebase 는 무슨 일을 하는가?

key - value 파일시스템

일단, 알아둘 명령어

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

Object 가 뭘까? 실험해보자

저장소를 시작하자.
그 후에 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 의 내용을 확인할 수 있다.

blob 의 정체는?

git cat-file -p <oid> 명령을 통해서 object 의 내용을 읽을 수 있다.
blob 은 파일의 내용이다.

tree 의 정체는?

파일 시스템에서의 디렉토리. 파일이름과 파일내용의 hash(blob) 을 가지고 있다.

버전 컨트롤

commit 은 무엇일까?

파일 시스템 상태에 대한 스냅샷이다. 따라서 root Tree 의 hash 를 가지고 있다.
추가적으로 버전 컨트롤을 위해서 부모 커밋의 hash 도 가지고 있다. 커밋메세지 및 작성자 등 커밋 메타 정보 또한 가지고 있다.

착각하기 쉬운 것이 commit 이 차이라고 생각하는 것이다. 하지만 우리가 보게되는 차이는 두개의 스냅샷간의 차이를 tree 순회 를 통해서 계산한 것 이다.

branch 는 무엇일까?

branch 는 commit 에 대한 포인터다.

두 커밋의 차이는 어떻게 알 수 있을까?

commit 이란 무엇일까의 대답참고

깃 명령의 이해

patch 는 무엇일까?

(추가적으로 정리가 필요하다)

cherry-pick 은 무슨일을 할까?

git cherry-pick <commit-id> 를 사용하면, HEAD 가 있는 커밋과 cherry-pick 대상의 공통의 부모를 고른다. 해당 부모와 대상의 차이를 계산한다. 그 후에, 차이를 현재 HEAD 에 반영한다.

rebase 는 무슨 일을 할까?

cherry-pick 과 유사하다. 차이는 rebase 를 하면, 공통 부모로 부터의 모든 커밋이 새로운 베이스 위로 복사된다는 점이다.

0개의 댓글