Git 내부 동작 원리: 인덱스, 블랍, 트리, 커밋 객체 설명
목차
- 목차
- 단계별 요약
- Git 초기화 (
git init
) - 파일 생성 (
touch f1.txt
) - 파일 스테이징 (
git add f1.txt
) - 인덱스 상태 확인 (
git ls-files -s
) - 블랍 객체 설명
- 새 파일 생성 및 스테이징 (
vim f2.txt
,git add f2.txt
) - 해시 값 기반 폴더 구조 설명
- 동일 내용 파일 처리
- git commit
- COMMIT_EDITMSG 파일
- logs/HEAD 파일
- objects 폴더
- Git 객체 저장 구조
- 블랍(blob) 객체
- 블랍 객체 생성 과정
- 인덱스 내용 예시
- 블랍 객체의 실제 내용
- 객체 라는 말이 자바스크립트 객체가 아니라 그냥 파일 하나를 객체라고 보면 될까요?
- 객체 유형을 구분하는 방법
- 2번째 커밋 후의 Git 내부 동작
- f2.txt 내용 변경 후 git add
- 두 번째 커밋 생성 (
git commit
) - logs/HEAD 파일 갱신
- Git Status의 동작 과정
- 인덱스와 최신 커밋 비교
- 마무리
- Git 초기화 (
- 질문: 객체 라는 말이 자바스크립트 객체가 아니라 그냥 파일 하나를 객체라고 보면 될까요?
- 답변:
단계별 요약
- Git 초기화 (
git init
).git
폴더가 생성되며 기본 디렉토리 구조가 설정됩니다.- 이 구조에는
objects
,refs
,HEAD
파일 등이 포함됩니다.
- 파일 생성 (
touch f1.txt
)f1.txt
파일이 생성됩니다.- 이 시점에서
.git
폴더에는 변화가 없습니다.
- 파일 스테이징 (
git add f1.txt
)f1.txt
의 내용이 블랍(blob) 객체로 저장됩니다.objects
디렉토리에 해시 값 기반의 폴더 및 파일이 생성됩니다.- 인덱스 파일(
.git/index
)에 스테이징된 파일의 메타데이터가 저장됩니다.
- 인덱스 상태 확인 (
git ls-files -s
)- 인덱스에 저장된 파일 목록과 메타데이터를 확인할 수 있습니다.
- 출력 결과는 파일 모드, SHA-1 해시, 스테이지 번호, 파일 이름으로 구성됩니다.
- 블랍 객체 설명
- 블랍 객체는 파일의 내용을 바이 너리 형식으로 저장하는 Git 객체입니다.
- SHA-1 해시를 기반으로 파일 이름이 결정되며, 객체는 압축된 형식으로 저장됩니다.
- 새 파일 생성 및 스테이징 (
vim f2.txt
,git add f2.txt
)- 새로운 파일을 생성하고 스테이징하면,
objects
디렉토리에 새로운 블랍 객체가 추가됩니다. - 인덱스 파일이 업데이트됩니다.
- 새로운 파일을 생성하고 스테이징하면,
- 해시 값 기반 폴더 구조 설명
- 성능 향상, 균등 분배, 관리 용이성을 위해 해시 값의 앞 두 자리를 사용하여 폴더를 만듭니다.
- 동일 내용 파일 처리
- 동일한 내용을 가진 파일을 추가하면 새로운 객체를 생성하지 않고, 기존의 블랍 객체를 재사용합니다.
git init
- .git 폴더 생성 및 폴더 생성
touch f1.txt
- f1.txt 파일이 생성되고 .git 의 파일은 변화 없음
- objects 폴더 또한 초기 값
git add f1.txt
git add를 하게 되면 로컬 작업 공간에서 → Staging Area 영역으로 파일이 관리하게 됩니다.
이는 add 한 파일이 .git/index에 sha-1로 변환되어 저장됩니다.
생성된 index
index는 확장자가 없고 blob 형식으로 만들어진 바이너리 파일 입니다.
index
파일에는 다음과 같은 정보가 포함됩니다:
- 스테이징된 파일의 경로
- 파일의 SHA-1 해시
- 파일의 권한 및 기타 메타데이터
git ls-files -s
명령어를 사용하면 인덱스에 저장된 파일 목록과 관련 메타데이터를 확인할 수 있습니다.
git ls-files -s
주어진 출력은 git ls-files -s
명령어의 결과입니다. 각 필드의 의미를 설명하겠습니다.
출력 해석
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 f1.txt
이 출력은 네 개의 필드로 구성됩니다.
- 파일 모드 (100644)
- 파일 모드를 나타냅니다.
100644
는 일반 파일의 권한을 의미합니다. 여기서100644
는 유닉스 파일 시스템에서의 권한을 의미하며, 읽기 및 쓰기 권한을 가지고 있는 일반 파일을 나타냅니다. - 644는 유닉스 권한 표현과 같습니다.
- 첫 번째 자리는 파일 타입(일반 파일은 1)
- 나머지 숫자는 소유자, 그룹, 기타 사용자의 읽기/쓰기 권한을 나타냅니다.
- git 에서 사용하는 파일 모드는 주로 3가지 입니다.
1.
100644
- 설명: 일반 파일 (읽기 및 쓰기 권한)
- 상세: 일반적인 텍스트 파일이나 코드 파일에 사용됩니다. 이 모드는 소유자에게 읽기 및 쓰기 권한을 부여하고, 그룹 및 기타 사용자에게 읽기 권한만 부여합니다.
- 1: 일반 파일
- 00644: 파일 권한
- 6: 소유자에게 읽기 및 쓰기 권한
- 4: 그룹에 읽기 권한
- 4: 기타 사용자에게 읽기 권한
2.
100755
- 설명: 실행 파일 (읽기, 쓰기 및 실행 권한)
- 상세: 실행 가능한 스크립트나 바이너리 파일에 사용됩니다. 이 모드는 소유자에게 읽기, 쓰기 및 실행 권한을 부여하고, 그룹 및 기타 사용자에게 읽기 및 실행 권한을 부여합니다.
- 1: 일반 파일
- 00755: 파일 권한
- 7: 소유자에게 읽기, 쓰기 및 실행 권한
- 5: 그룹에 읽기 및 실행 권한
- 5: 기타 사용자에게 읽기 및 실행 권한
3.
120000
- 설명: 심볼릭 링크 (symbolic link)
- 상세: 심볼릭 링크 파일에 사용됩니다. 심볼릭 링크는 다른 파일이나 디렉토리를 가리키는 특별한 파일입니다. 이 모드는 파일 권한이 아닌 링크를 나타내는 값을 사용합니다.
- 120000: 심볼릭 링크
요약
100644
: 일반 파일로 읽기 및 쓰기 권한 (rw-r--r--
)100755
: 실행 파일로 읽기, 쓰기 및 실행 권한 (rwxr-xr-x
)120000
: 심볼릭 링크 이 세 가지 파일 모드는 Git이 파일의 유형과 권한을 관리하는 데 사용됩니다.git ls-files -s
명령어의 출력에서 파일 모드는 각 파일의 특성과 권한을 나타내는 중요한 정보입니다.
- 파일 모드를 나타냅니다.
- SHA-1 해시 (78981922613b2afb6025042ff6bd878ac1994e85)
- 스테이징된 파일의 내용에 대한 SHA-1 해시 값입니다. 이 해시는 파일의 고유한 식별자로 사용되며, 파일의 내용이 변경되면 이 값도 변경됩니다.
- Stage 번호 (0)
- Git의 병합 과정에서 사용되는 스테이지 번호를 나타냅니다. 여기서
0
은 파일이 병합 과정에 관여하지 않는다는 것을 의미합니다. Git의 병합 충돌 해결 시 여러 스테이지가 존재할 수 있습니다.
- Git의 병합 과정에서 사용되는 스테이지 번호를 나타냅니다. 여기서
- 파일 이름 (f1.txt)
- 인덱스에 스테이징된 파일의 이름입니다. 여기서는
f1.txt
파일이 스테이징 영역에 있다는 것을 나타냅니다.
- 인덱스에 스테이징된 파일의 이름입니다. 여기서는