3가지 작업 영역
- Working Directory: 현재 내가 작업하고 있는 프로젝트 폴더(디렉토리)
- staging area: git add를 한 파일들이 존재하는 영역.
- 커밋을 하게되면 staging area에 있는 파일들만 커밋에 반영됨
- repository: working directory의 변경 이력들이 저장되어 있는 영역.
- 커밋들이 저장되는 영역
요약하면
작업한 파일들을 git add 로 staging area 에 추가해주고, 커밋을 하면 staging area에 있던 파일들의 모습이 마치 영화의 한 장면 마냥, 스냅샷이 되어 repository에 저장됨
(출처 : 코드잇)
왼쪽부터 순서대로
- working directory
- staging area
- repository
가 있고 다음과 같은 작업을 한 상태를 나타냄
- working directory에서 A.txt 파일과 B.txt 파일을 작성하고
- git add A.txt 와 git add B.txt 를 실행해서 A.txt , B.txt 모두 staging area에 올림
- 그 다음 git commit -m "Ver_1" 명령어로 staging area에 있는 파일들을 가져와 커밋으로 남김
이번에는
- working directory에서 A.txt 파일 내용에 Python~ 이라는 단어를 추가하고
- B.txt 파일 내용에 Morning! 이라는 내용을 추가
이번에는 B.txt 파일만 staging area에 올릴 것임
$ git add B.txt
추가하고 커밋
$ git commit -m "UPD"
-
A.txt는 staging area에 있던 모습, 그러니까 수정하기 이전의 모습이 Ver_2 커밋에 반영되었고
-
B.txt도 staging area에 있던 모습, 하지만 A.txt와는 달리 수정한 이후의 모습이 Ver_2 커밋에 반영되었음.
A.txt, B.txt 둘다 working directory에서 수정했다는 사실은 같지만,
staging area에 올렸는지 여부에 따라 그 최신 모습이 커밋에 반영되는지가 달라짐.
바로 이 점이 Git을 사용할 때 잘 알고 기억해야하는 부분
그런데 staging area가 굳이 왜 필요할까?
working directory에서 작업을 하고 git add할 필요없이 바로 커밋해버리는 구조가 더 편할 것 같은데. 하지만 꼭 그렇지는 않다.
방금처럼 A.txt와 B.txt 파일을 둘다 수정했더라도 두 파일 모두 그 최신 모습을 다음 커밋에 반영하고 싶지 않을 수도 있음.
방금처럼 B.txt의 최신 모습만 그 다음 커밋에 반영하고 싶을 수도 있는 것.
만약 staging area가 없다면 원하는 것들만 선별적으로 커밋에 반영할 수 없게 될 것임 그럼 좀더 세밀한 버전 관리를 할 수 없게 되는 거고.
Git File Status
- Untracked: Working Directory에 있는 파일이자만 Git으로 버전관리 하지 않은 상태
Untracked files:
(use "git add <file>..." to include in what will be committed)
test.txt
- Unmodified: 신규로 파일이 추가된 경유 , new file 상태와 같음
- git add 한 직후
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: test.txt
- Modified: 파일이 추가된 이후 해당 파일이 수정되었을 때
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: 2022-02-28-git-three-work.md
- staged: Staging Area에 반영된 상태
(출처 : 코드잇)