2장 작업 폴더·스테이징·커밋을 손으로 구분한다
Git 초보가 가장 많이 놓치는 것은 파일이 아니라 영역이다. 작업 폴더는 편집기의 현재 내용, 스테이징 영역은 다음 커밋에 넣기로 고른 내용, HEAD는 현재 브랜치가 가리키는 커밋이다. 같은 파일도 작업 폴더와 스테이징에 서로 다른 변경을 가질 수 있다.
printf '검토자: 미정n' >> notes/v1.md
git status --short
git add notes/v1.md
printf '발행일: 금요일n' >> notes/v1.md
git status --short
git diff
git diff --staged
git status --short의 두 칸은 각각 스테이징과 작업 폴더다. MM notes/v1.md라면 일부 변경은 staged, 그 뒤의 변경은 아직 unstaged다. git diff는 작업 폴더와 스테이징의 차이, git diff --staged는 스테이징과 HEAD의 차이다. “diff가 비었다”는 변경이 없다는 뜻이 아닐 수 있다. 어느 두 영역을 비교했는지 먼저 말해야 한다.
전체가 아니라 줄 일부만 고르려면 CLI에서 git add -p notes/v1.md를 쓴다. SourceTree에서는 파일의 hunk 또는 line 단위 스테이징, IntelliJ에서는 Commit 도구 창의 변경 목록에서 원하는 변경만 포함한다. 세 방법 모두 스테이징 영역을 편집한다.
되돌리기 연습
git restore --staged notes/v1.md
git restore notes/v1.md
git status --short
첫 명령은 스테이징만 취소하고 작업 내용은 남긴다. 두 번째는 작업 폴더의 변경을 HEAD 상태로 덮는다. 순서를 거꾸로 하면 staged 내용이 남을 수 있다. 실행 전후 diff 두 종류를 확인한다.