글: Commits are snapshots, not diffs
깃 헙 블로그에 커밋에 대한 글을 읽고 스터디를 참여했다.
처음에 영어로 되어있는 글이라서 내가 이해를 못한 건지, 아니면 그냥 개념 자체가 이해가 안 되는 것인지 아리송해서 다른 영상자료 (생활코딩 지옥에서 온 깃 등) 들을 참고해서 두루뭉술한 개념 정도밖에 알고 가지 못했는 데 스터디에서 이야기를 나누면서 잘 정리가 되었다.
아래는 스터디를 바탕으로 정리한 내용이다.
깃이란?
뭔가를 찾을 수 있는 파일 시스템.
깃 오브젝트들의 파일 모드
- blob - 파일 내용 -> hash 키를 반환함.
- tree - 디렉토리를 나타낸다.
- commit - 현재 디렉터리를 스냅숏으로 하는 것
- 식별자
- tag
- root 와 tree들
- 작성자
- message
- parent
각각의 커밋은 각각의 트리를 가리킨다.
커밋을 할 때 보이는 건 두 파일 사이의 차이만 계속 보이니까 언뜻 보면 차이만 저장하는 것처럼 생각하기 쉽지만 사실은 diff가 아니다. diff는 다이나믹하게 변화를 계산하지만 commit은 스냅숏일 뿐이다.
새로운 커밋을 할 때마다 변화가 없는 블롭은 해쉬가 바뀌지 않고 다른 트리로 향해진다.
즉 변화가 없는 블롭을 새 트리에서 새로 만드는 것이 아니라 새 트리에서 기존의 블롭을 가리키는 것이다.
헤드란?
현재 브랜치를 가리킨다.
브렌치는?
브렌치는 커밋을 가리킨다. 커밋에 대한 레퍼런스일 뿐이다.
커밋은 스냅샷이기 때문에 브렌치를 내가 가고 싶은 곳의 커밋을 가리키도록 수정할 수 있다.
깃은 파일의 rename을 어떻게 추적하는가?
rename을 추적하지 않는다. 다만 깃은 diff를 계산할 때 rename을 알아낸다.
패스를 추적하면서 디프를 계산할 때 패스가 없고 있고로 rename을 알아낼 수 있다.
체리픽은 어떻게 동작하는가?
현재의 커밋(지금 내가 입력한 커밋)을 동일하게 복사한 커밋을 만들어서 HEAD가 가리키는 커밋에 덮어 씌운다.
HEAD가 가리키는 커밋과 현재의 커밋의 공통 지점을 찾아 그 지점에서 전 작업과의 diff를 계산하고 그것을 다시 HEAD가 가리키는 커밋에 차이를 덮어 씌우게 되는 것이다.
아쉬운 점
스터디에서 선정했던 글로 나의 이해가 충분하지 않다면 다른 자료를 더 찾아보아서 최대한 아는 상태로 스터디에 참여하는 자세를 키워야겠다. 그래야 더 많이 나누고 더 많이 얻어갈 수 있을 것이다. 다음 주제는 객체지향의 사실과 오해 책으로부터 시작한다. 그 후 줄줄이 객체지향에 대해 깊게 공부하게 될 것이다. 나는 일단 객체지향 자체를 모른다는 건 확실함으로 책 읽기에 소홀하지 않는 건 당연하고 다른 참고 자료도 더 보고 갈 수 있도록 해봐야겠다.
reference : Commits are snapshots, not diffs
- The GitHub Blog - https://github.blog/2020-12-17-commits-are-snapshots-not-diffs/
'코드숨 > 스터디' 카테고리의 다른 글
20210113 객체지향의 사실과 오해 스터디(1) 회고 (0) | 2021.01.15 |
---|---|
20201230 클린 애자일 스터디 회고 (0) | 2020.12.30 |
20201223 The nature of software development 스터디 후기 (0) | 2020.12.23 |
20201004 T.I.L '코딩의 기술' 스터디 5회차 회고 (0) | 2020.10.04 |
20201003 T.I.L '코딩의 기술' 스터디 4회차 회고 (0) | 2020.10.03 |