세 영역, 세 가지 책임
Git 의 거의 모든 혼란은 세 영역을 헷갈리는 데서 와. 한 번만 제대로 박아두면 추측 몇 년치를 아껴. 셋은 working tree, index (staging area), repository.
working tree 는 네가 편집하는 그냥 디스크 위 파일들이야. Git 이랑 직접 상관없어 — 그냥 현재 checkout 된 상태일 뿐이야. editor 도, build tool 도, 네 눈도 다 working tree 와 상호작용해.
index (staging area) 는 가장 의외의 layer 야. .git/index 라는 binary file 에 살면서 '다음 commit 후보 snapshot' 을 들고 있어. git add file.js 는 어딘가 추상적인 list 에 'commit 표시' 하는 게 아니야 — file.js 의 그 순간 내용을 blob 으로 index 에 복사하고 entry 를 업데이트해. add 후에 file 을 또 바꿨으면? index 는 add 시점 version 을 그대로 들고 있어. 그래서 git diff 는 working tree vs index, git diff --staged 는 index vs 마지막 commit 을 보여주는 거야.
repository 는 .git/ 아래 전부 — object, ref, index file 자체, hook, config, packed history. git commit 은 현재 index 를 가져가 tree object 로 얼리고, metadata 를 씌워서 commit object 로 만들고, 현재 branch 를 그 commit 으로 가리키게 해. 세 영역, 세 명령: git add = working tree → index, git commit = index → repository, git restore = 양방향 되돌리기.