Git의 명령어 작동 방식
Git의 명령어들이 내부에서 어떻게 움직일까?
Git
init
- 핵심 역할: 저장소 초기화
- .git 내부에서 일어나는 일
- .git 디렉토리 생성
- object, refs, hooks 등 버전 관리에 필요한 모든 하위 폴더와 기본 설정 파일들을 만듦
- HEAD 파일 생성
- 기본 브랜치를 가리키는 포인터인
.git/HEAD파일을 생성
- 기본 브랜치를 가리키는 포인터인
- .git 디렉토리 생성
branch
- 핵심 역할: 브랜치 관리
- .git 내부에서 일어나는 일
- 생성:
.git/refs/heads/폴더 안에 새로운 브랜치 이름으로 된 파일을 만듦 - 조회: 위 폴더 안의 파일 목록을 읽어서 보여줌
- 삭제: 위 폴더에서 해당 브랜치 파일을 삭제
- 생성:
add
- 핵심 역할: 파일 스테이징
- .git 내부에서 일어나는 일
blob객체 생성: 변경된 파일의 내용을 압축하고 해시값을 계산해blob객체를 만듦- 생성된
blob객체를.git/objects/에 저장 - "어떤 파일이 어떤
blob객체를 가리킨다는 정보를.git/index파일에 기록/갱신
status
- 핵심 역할: 작업 디렉토리와 스테이지 영역의 현재 상태를 보여줌
- .git 내부에서 일어나는 일
HEAD커밋과index비교:HEAD가 가리키는 최신 커밋의 내용과index파일(스테이징 영역)을 비교하여 커밋할 변경 사항을 찾아냄index와 작업 디렉토리 비교:index파일의 내용과 실제 작업 디렉토리의 파일들을 비교해 아직 스테이징 되지 않은 변경사항을 찾아냄
commit
- 핵심 역할: 버전 기록
- .git 내부에서 일어나는 일
tree,commit객체 생성:index파일 상태로tree객체를, 그리고 이tree와 부모 커밋 정보를 담아commit객체를 만듦- 생성된 객체들을
objects폴더에 저장 - 현재 브랜치 파일이 새로 만든
commit객체를 가리키도록 해시값을 갱신 - 로그 기록:
.git/logs/에 커밋 이력을 기록
log
- 핵심 역할: 커밋 이력 조회
- .git 내부에서 일어나는 일
HEAD부터 시작해 현재 브랜치가 가리키는 최신 커밋 해시를 찾음.git/objects/에서 해당commit객체를 읽음- 객체 안의 부모 커밋 정보를 따라가며 이 과정을 반복하여 이력을 보여줌
switch
- 핵심 역할: 현재 작업 중인 브랜치를 다른 브랜치로 전환함
- .git 내부에서 일어나는 일
HEAD파일 업데이트:.git/HEAD파일의 내용이 이동하려는 대상 브랜치를 가리키도록 변경됨index및 작업 디렉토리 업데이트: 이동할 브랜치의 최신 커밋 정보를 바탕으로index파일과 실제 작업 디렉토리의 파일들을 해당 커밋의 상태와 일치하도록 갱신