seungjun.dev

Git의 명령어 작동 방식

Git의 명령어들이 내부에서 어떻게 움직일까?

init

  • 핵심 역할: 저장소 초기화
  • .git 내부에서 일어나는 일
    • .git 디렉토리 생성
      • object, refs, hooks 등 버전 관리에 필요한 모든 하위 폴더와 기본 설정 파일들을 만듦
    • HEAD 파일 생성
      • 기본 브랜치를 가리키는 포인터인 .git/HEAD 파일을 생성

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 파일과 실제 작업 디렉토리의 파일들을 해당 커밋의 상태와 일치하도록 갱신