본문 바로가기

코드숨/스터디

20210106 Commits are snapshots, not diffs 스터디

 

 

 

글: 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/