Git 작업 영역
깃은 저장공간을 크게 작업을 하는 공간(working)과 임시로 저장하는 공간(stage), 실제로 저장하여 기록하는 공간(repository)으로 나눈다. 이렇게 논리적으로 공간을 분리함으로써 깃의 동작과 이력을 효율적으로 처리할 수 있다.
Working Directory
Working Directory는 작업을 하는 공간을 의미한다. 말 그대로 로컬 저장소에 접근할 수 있으며, 실제로 파일을 생성하고 수정하는 공간이다. 깃은 Working Directory에 있는 파일들을 tracked와 untracked 상태로 구분한다.
untracked 상태와 tracked 상태
Working Directory에 새로 생성된 파일들은 모두 추적되지 않음(untracked) 상태이다. 이 파일들을 관리하려면 깃에 추적하라고 통지에 주어야 하며 그렇지 않을 경우 깃에서 따로 추적하지 않는다. Working Directory 안에 추적되지 않는 상태의 파일들은 git add 명령어를 사용하여 추적(tracked) 상태로 변경할 수 있다.
$ git add
Staging Area
Staging Area는 Working Directory와 실제로 저장하여 기록하는 공간 사이에 있는 임시 영역이다. 이곳에는 커밋될 파일의 변경된 내용(스냅샷)이 저장된다. git add를 실행하면, untracked 상태였던 파일이 tracked 상태로 변경되며 Staging Area에 등록된다. 한 번 tracked 상태가 된 파일은 이후에도 계속 추적된다.
Staging Area에 등록된 파일들은 다시 staged와 unstaged 상태로 구분된다. 파일의 Stage 상태는 status나 ls-files 같은 명령어로도 확인 가능하다.
$ git status
$ git ls-files --stage
staged 상태와 unstage 상태
깃에서 변화 이력을 기록하려면 파일들의 최종 상태가 staged 상태여야 한다. unstaged 상태는 파일이 수정되었지만 Staging Area에 반영되지 않은 상태를 의미한다. Staging Area에 있는 파일을 Working Directory에서 수정하면 기존 Staging Area의 상태는 그대로 유지된 채로 수정된 내용이 unstaged + modified 상태로 추가된다.
즉, Staging Area에 올라가 있는 staged 상태와 Staging Aread에 올라간 후 파일이 수정되어 unstaged + modified 상태라는 두 가지 버전을 가지게 되는 것이다.
modified 상태와 unmodified 상태
modified 상태란 Staging Area에 있는 버전과 다르게 수정된 파일을 의미하며, 다시 git add를 실행하면 변경된 내용이 Staging Area에 반영된다. 반면, unmodified 상태는 Staging Area와 Working Directory의 파일이 동일한 최신 상태를 의미하며, 추가적인 등록이 필요하지 않다.