[Git] Ch.7 Git 내부 동작 원리

Hwichan Ji·2021년 3월 13일
0

Git

목록 보기
8/8
post-thumbnail

팀 개발을 위한 Git, GitHub 시작하기(정호영, 진유림 지음)으로 공부한 내용을 정리한 글입니다.

git add의 동작 원리

git status

  • 워킹트리와 스테이지, 그리고 헤드 커밋에 저장된 파일의 차이를 비교해서 보여주는 명령어
  • 새로 생성된 파일은 워킹트리에 저장됨

git hash-object

$ git hash-object <file name>
  • 파일의 Checksum을 확인하는 명령어
  • 파일은 내용이 같다면 언제나 똑같은 Checksum을 가짐
  • 다른 파일이지만 내용이 같다면 똑같은 Checksum을 가짐

git add

  • 워킹트리에 존재하는 파일을 스테이지에 추가하는 명령어
  • 최초로 git add를 실행하면 .git 폴더에 index 파일이 생성되는데, 이 index 파일이 Git stage
  • .git/objects 폴더에 파일 Checksum의 앞 두자리를 폴더명으로 하는 폴더가 생성됨
  • 해당 폴더에는 파일 Checksum의 앞 두자리를 제외한 문자열을 파일명으로 하는 git object가 생성됨
  • git object의 파일 형식은 blob

git commit의 동작 원리

git commit

  • 스테이지의 내용으로 커밋을 생성하는 명령어
  • git commit을 실행하면 .git/objects 폴더에 git add 때와 같은 방식으로 git object가 생성됨
  • git object는 커밋 객체임
  • 커밋 객체는 각자 고유한 Checksum을 가짐

commit 후 워킹트리, 스테이지, 헤드

  • commit 후에 스테이지에서 파일이 제거될거라고 생각하기 쉬운데 사실을 그렇지 않음
  • 워킹트리, 스테이지, 헤드에 속한 파일이 모두 똑같아짐 → 이를 clean하다고 함

Git tree 객체

  • git commit을 실행하면 .git/objects 폴더에 git tree object도 생성됨
  • 이 트리는 스테이지의 객체로 만들어진 트리임
  • 스테이지의 객체가 동일하다면 트리 객체는 항상 동일한 Checksum을 가짐
  • 트리 객체는 해당 트리를 생성한 커밋 객체에 포함됨

파일을 수정했을 때

파일 수정

  • 이미 한번 커밋한 파일을 수정하는 경우 워킹트리에 속한 파일의 Checksum만 바뀜
  • 이 경우 파일은 modified 상태가 되는데, 이는 워킹트리 속 파일 Checksum이 스테이지 속 파일 Checksum과 다른 경우를 말함

수정된 파일 add

  • 수정된 파일을 git add 명령어를 통해 스테이지에 추가한 경우, 스테이지 속 파일의 Checksum이 워킹트리 속 파일의 Checksum과 같아지게 됨
  • 이 경우 파일의 상태는 staged가 됨

중복 파일 관리

  • Git에서 파일들은 blob으로 관리되며, 이 blob은 파일의 제목이나 생성 날짜와는 관계 없이 내용이 같을 경우 같은 CheckSum을 가짐
  • 따라서 같은 내용을 같은 파일을 여러개 만들어도 Git은 하나의 blob으로 해당 파일들을 관리함
  • 파일 목록은 index 파일에 Checksum과 함께 저장되어 있기 때문에, 동일한 내용을 같는 파일을 하나의 blob으로 관리할 수 있음

Git branch의 동작 원리

branch 생성

  • branch를 생성하면 .git/refs/heads 폴더에 branch명으로 파일이 생성됨
  • 해당 파일에는 그 branch가 가리키고 있는 커밋의 Checksum이 저장되어 있음

checkout

  • 해당 branch 파일에 저장된 커밋으로 HEAD를 이동시킴
  • 스테이지와 워킹트리를 HEAD가 가리키는 커밋과 동일한 내용으로 변경함
profile
안드로이드 개발자를 꿈꾸는 사람

0개의 댓글