[Git] git add 명령의 동작 원리

2022. 4. 22. 17:33Git

1. git init 다시 보기

git init 명령 수행시 변경사항 확인

$ mkdir git-test

$ cd git-test

$ git init

$ ls -al

$ ls -al .git/

git init 명령어를 수행하면 현재 폴더 아래에 [.git] 폴더가 생성됩니다. 이 폴더가 로컬저장소입니다.

 

2. git add와 git status 다시 보기

git hash-object <파일명>
일반 파일의 체크섬을 확인할 때 사용됨

git show <체크섬>
해당 체크섬을 가진 객체의 내용을 표시함

git ls-files --stage
스테이지 파일의 내용을 표시함
스테이지 파일은 git add 명령을 통해 생성되는데 .git/index 파일이 스테이지 파일임

 

파일 생성 및 워킹트리 상태 확인

git-test $ echo "cat-hanbit" > cat.txt

git-test $ git status

git status 명령은 워킹트리와 스테이지, 그리고 HEAD 커밋 세가지 저장 공간의 차이를 비교해서 보여줍니다. 현재 상태는 다음과 같습니다.

  • 새로 파일을 생성할 경우 워킹 트리에만 해당 파일이 존재함
  • 스테이지는 아직 비어있는 상태
  • 커밋이 아직 한번도 하지 않았기 때문에 HEAD 커밋은 없음

 

파일의 체크섬 확인

git-test $ git hash-object cat.txt # 파일의 체크섬 확인

 

스테이지의 파일 추가

git-test $ git add cat.txt # 파일 스테이징

git-test $ git status # 파일 상태 확인

git-test $ ls -a .git # .git 폴더 확인, index가 생성되어 있음

git-test $ file .git/index # .git/index 파일의 정체 확인

git-test $ git ls-files --stage # 스테이지 파일의 내용 확인

  • index는 스테이지의 다른 이름
  • git ls-files --stage 명령어를 통해서 스테이지의 내용을 확인할 수 있음

 

git-test $ ls -a .git/objects/

git-test $ ls -a .git/objects/ff

git-test $ git show ff5bda

  • [.git/objects] 폴더 아래에 ff/로 시작하는 폴더가 새로 생긴것을 알 수 있음
  • [.git/objects/ff] 폴더 아래에는 5bda로 시작하는 파일이 하나 있는데 폴더명과 파일명을 합쳐보면 "ff5bda"입니다. 정확하게 앞에서 확인했던 체크섬 값입니다. [objects] 폴더 안에 존재하는 파일들은 Git 객체입니다.
  • git show ff5bda 명령어로 해당 객체의 내용을 확인하면 cat-hanbit이라는 텍스트 파일이라는 것을 알 수 있습니다.

 

git cat-file 명령어

git cat-file -t <체크섬>
해당 체크섬을 가진 객체의 타입을 알려주는 명령어

git cat-file <객체타입> <체크섬>
객체의 타입을 알고 있을 때 해당 파일의 내용을 표시

 

체크섬을 이용한 객체의 상태 확인

git-test $ git cat-file -t ff5bda # 체크섬으로 객체의 종류 확인

git-test $ git cat-file blob ff5bda # 해당 객체의 내용을 출력

 

정리하며

  • git add 명령은 워킹트리에 존재하는 파일을 stage에 추가하는 명령
  • add 명령은 해당 파일의 체크섬 값과 동일한 이름을 가지는 blob 객체가 생성되고 이 객체는 .git/objects 파일에 저장됨
  • 스테이지의 내용은 .git/index에 기록됨

 

References

source code : https://github.com/yonghwankim-dev/git_study
팀 개발을 위한 Git Github 시작하기, 정호영 진유림 저

 

'Git' 카테고리의 다른 글

[Git] git commit 명령의 동작 원리  (0) 2022.04.22
[Git] CLI로 rebase 수행  (0) 2022.04.22
[Git] CLI로 3-way 병합하기  (0) 2022.04.22
[Git] CLI로 checkout 하기  (0) 2022.04.22
[Git] CLI로 브랜치 생성하기  (0) 2022.04.22