세 영역에는 각자 맡은 일이 있어
Git에서 생기는 혼란 대부분은 세 영역을 한데 뭉뚱그리는 데서 시작해. 이것만 정확히 잡아도 몇 년치 시행착오를 아낄 수 있어. 셋은 작업 트리(working tree), index(staging area), repository야.
작업 트리는 네가 디스크에서 직접 편집하는 파일들이야. 현재 checkout된 모습이 펼쳐진 곳이지. 편집기도, 빌드 도구도, 네 눈도 이 영역을 상대해.
index는 처음 배울 때 가장 낯선 영역이야. .git/index라는 binary file에 살면서 '다음 commit이 될 후보 snapshot'을 들고 있어. git add file.js는 추상적인 목록에 commit 표시를 붙이는 명령이 아니야. 그 순간의 file.js 내용을 blob으로 저장하고 index entry를 갱신해. add한 뒤 파일을 다시 바꿨다면 index에는 add 당시 version이 그대로 남아 있어. 그래서 git diff는 작업 트리와 index의 차이를, git diff --staged는 index와 마지막 commit의 차이를 보여줘.
repository는 .git/ 아래의 모든 것이야. object, ref, index file, hook, config, 압축된 이력이 전부 여기에 있어. git commit은 현재 index를 tree object로 얼리고 metadata를 붙여 commit object를 만든 다음, 현재 branch가 그 commit을 가리키게 해. 세 영역을 세 이동으로 기억하면 돼. git add는 작업 트리에서 index로, git commit은 index에서 repository로, git restore는 영역 사이를 되돌리는 명령이야.