git의 원리에 대해 알아보자 (add, commit, status)

git의 원리

전체적인 흐름은 아래 그림과 같다. 여기서 add와 commit 그리고 status의 원리와 함께 위 흐름 중 일부를 간략하게 살펴보자



gid add의 원리

  1. git add를 하면 index 파일과 object 폴더 내에 파일에 변화가 생겨! (index 파일과 object 파일은 .git 폴더 내에서 확인 가능)
  2. object 폴더 내에 생성된 파일들을 보면 add한 파일들의 내용물이 들어있어!
  3. 그럼 해당 파일의 명은 어떻게 관리를 하는데?! → index 파일에서 파일의 명들을 관리하고 있어.
  1. git에서 관리되는 파일들은 그 내용을 바탕으로 해쉬값을 얻어 관리해 → 즉 같은 내용의 파일들에 대해서 중복을 제거하며 관리할 수 있는거지! (그래서 cp 명령어를 통해 파일을 copy한 후 add를 해볼 경우 index파일의 내용에서는 새로운 파일명에 대한 정보가 있지만 새로운 파일명에 해당하는 실제 위치는 기존에 copy 했던 대상 파일을 가리키고 있어)



git commit의 원리

  1. commit을 하면 commit의 내용에 대한 파일이 object폴더 내에 생겨!!

  2. 크게 현재 commit 버전의 snapshot에서 관리되는 파일들의 위치, 이전 커밋, author, committer, commit 내용등이 담겨져 있어!!

  3. 위의 commit 한 즉 해당 버전에 속한 파일들을 담고있는 위치 값에 가보면, 각 파일들의 파일명과 실제 위치 정보가 나와있는거지!

    • tree가 commit한 즉 해당 버전에 속한 파일들을 가지고 있어. 한마디로 정의하자면 commit하는 시점의 working directory의 snapshot인거지
    • parent는 이전 커밋을 가리키고 있어
    • 그 외에는 author, committer, commit message야
  4. 위의 tree에 해당하는 값으로 이동하면 위의 파일 위치 즉 해쉬값이 local repository에서 관리하고 있는 hi.txt의 위치가 되지. 참고로 저 값은 directory name(앞 2개) + file content 를 바탕으로 해쉬값을 얻은거야!!

  5. 위의 commit 한 시점의 working directory의 snapshot 내용들 중 hi.txt blob 값으로 이동하면 실제 hi.txt의 내용들이 나오는거지

  6. 참고로 디렉토리 정보도 tree 라는 형태로 표현되어져!! 그리고 그 tree의 값은 결국은 그 디렉토리 안에 있는 파일의 해싱값을 가지고 있어.

    commit 후 objects 폴더 내에 생성된 내용을 보면

    위 dir_test 디렉토리 tree에 해당하는 값을 읽어보면

    이렇게 되는거야



git status의 원리

  1. git status 명령어는 그 결과로 수정된 파일의 정보를 가르쳐주지 → how?
  2. index에 있는 파일의 정보와 실제 파일의 내용을 비교하고 그 결과가 다름을 바탕으로 알려주는거야!
  3. add를 하기 전 후 git status의 결과로 수정된 파일들의 내역을 볼 수 있는 것은 같으나 그 내역들이 조금 다르지 ( stage에 올라오지 않았다 vs commit할 준비가 되어있다)
  4. 그럼 커밋할 준비가 되어있단 것은 어떻게 아는가? → add하는 순간 index 파일에 add한 파일의 내용이 추가되며 해당 추가된 내용과 실제 파일의 내용이 같기에 커밋할 준비가 되어있다고 판단하는거야!
  5. 그럼 기존에 커밋한 개체들과 커밋할 준비가 되어있는 개체들의 판단은 어떻게 하냐구!? → index 파일의 내용 중 각 파일들의 tree를 따라가 실내용과 마지막 커밋의 내용을 담고있는 파일의 tree 내용을 따라가 그 파일의 실내용을 비교하여 다르다면 아직 커밋하지 않았구나! 커밋할 준비가 되어있다! 라고 판단하는거지