Git의 3가지 상태와 4가지 공간 개념, 그림으로 이해하자!

민준·2025년 2월 1일
post-thumbnail

Git의 3가지 상태

  • Git에서 파일을 수정하고 커밋하기까지의 과정은 크게 3가지 상태로 나누어짐.

1. Committed

  • 최종적으로 저장된 상태 (git commit 실행됨)

2. Tracked

  • Git이 알고 있는 파일 이미 한번 git add 한적 있음

  • 여기서 다시 Unmodified, Modified, Staged로 나뉨

    • 2.1 Unmodified : 변경되지 않음

    • 2.2 Modified : 수정되었지만 아직 Staging Area에 안 올림

    • 2.3 Staged : Staging Area에 올라간 상태 (곧 커밋될 예정)

3. Untracked

  • Git이 모르는 파일 (한번도 git add 한 적 없음)

Git의 4가지의 공간 개념

  • Git에서 작업이 진행되는 공간(영역)도 4가지가 있음

Working Directory

  • 현재 작업 중인 디렉토리 (수정하는 곳)

Staging Area

  • 커밋할 파일을 모아두는 공간 (git add 하면 여기에 올라감)

Unstaged

  • Staging Area에 올리지 않은 변경된 파일 (수정됐지만 git add 안 한 상태)

Untracked

  • Git이 아직 모르는 파일 (git add 한 적 없는 파일)

Git의 상태와 공간 개념 연결하기

1. 처음 Git에 파일을 만들면?

  • Git이 모르는 파일이므로 Untracked 상태
  • 공간 개념으로 보면 Working Directory에 있음

2. 파일을 Git에 추가하면? (git add)

  • Git이 관리하게 되므로 Tracked 상태로 변경
  • 동시에 Staging Area에 올라감 (Staged 상태)

3. 커밋하면? (git commit -m "메시지")

  • Git이 파일을 확정 저장 (Committed 상태)
  • Staging Area가 비워지고, 파일은 다시 Unmodified 상태로 돌아감

4. 커밋한 파일을 다시 수정하면?

  • Modified 상태가 됨 (변경되었지만 Staging Area에 안 올림)
  • 즉, Unstaged 상태에 있음

5. 파일을 다시 git add 하면?

  • 다시 Staging Area로 올라가고, Staged 상태가 됨

6. 파일을 git restore --staged 하면?

  • Staging Area에서 빠지고 다시 Modified 상태 (Unstaged 상태) 로 돌아감

7. 파일을 git restore 하면?

  • 변경 사항이 사라지고 마지막 커밋된 상태(또는 git add 이전 상태)로 돌아감
  • 다시 Unmodified 상태가 됨

실제 Git 스크린샷으로 간단하게 3개 영역 이해하기

  • Working Directory 작업공간 : 로컬 작업공간에서 작업할 브랜치 선택 → git checkout

    • Working Directory 작업공간 내 Staging Area(commit을 대기하고 있는 파일) / Unstaged(추적하고 있는 파일) / Untracked(추적하지 않는 파일)
    • 여기에 나온 git rmgit restore 그리고 git restore --staged
  • 첫번째 초록색 블럭 = Staging Area : Commit 되기위해 대기중인 (1)추가 + (2)수정 + (3)삭제된 파일

    • (1) new file: + (2) modified: + (3) deleted:
    • git commit 명령어 시 여기에 있는 파일들이 Commit 된다 (스냅샷 찍힘)
  • 두번째 빨간색 블럭 = Unstaged : Git 이 추적하는 파일 중 (2)수정 + (3)삭제된 파일들의 집합

    • (2) modified: + (3) deleted:
    • 이 중에서 Commit 하고자하는 것들을 Staging Area 로 올린다 → git add
  • 세번째 빨간색 블럭 = Untracked : 아직 Git 이 추적하지 않는 파일 (새로 (1) 추가된 파일)

    • (1) new file:
    • 이 중에서 Commit 하고자하는 것들을 Staging Area 로 올린다 → git add
      • Commit 하고싶지 않은 임시 혹은 중요 파일들은 ⇒ .gitignore 에 추가

1. 파일 수정 시나리오

  • Tracked : Git 이 추적하는 파일 중 수정 시나리오

  • 모든 파일 변경 내용은 Unstaged 상태로. Commit 할것들만 선택적으로 Staging Area 로 전달

    • git add <file> : 변경된 파일 하나만 지목하여 Staging Area 로 전달
    • git add . : 모든 파일 변경 사항들을 한번에 Staging Area 로 전달
    • git add -p : 모든 파일 변경 사항들을 작은 단위로 세부적으로 확인하며 Staging Area 로 전달
      • 파일을 작은 단위를 Hunk 라고 부르며 몇가지 옵션을 통해 손쉽게 활용 가능
        • y = yes : 현재 보고있는 hunk 를 add(stage) 합니다.
        • n = no : 현재 보고있는 hunk 를 add(stage) 하지않습니다.
        • q = quit : 현재 add(stage) 과정 종료 = add 할건 다 끝나서 더 이상 볼 필요 없을때
        • s = small : 현재 보고있는 hunk 를 더 작은 단위의 hunk 로 나눕니다.
        • e = edit : 현재 보고있는 hunk 내용을 직접 편집합니다.
  • Staging Area 로 전달한것을 다시 복구시키고싶다면

    • git restore --staged <파일이름> : Staging Area → Unstaged (git add 이전)
    • git restore <파일이름> : Unstaged → (Unmodifed) (수정 이전)

2. 파일 추가 시나리오

  • Untracked : Git 이 추적하고있지 않은 파일 추가 시나리오

  • 파일을 추가 시 Git 이 전혀 알지못하는 새로운 파일이라 Untracked 에 추가된다

    • 추가한 파일을 내 로컬에서만(나만) 사용할것인지? Git 에 등록할것인지? 검토 필요
      1. 내 로컬에서만(나만) 쓸거라면 Git 에 추적되지 않도록 .gitignore 내 등록 : 민감 정보 등
      2. Git 에 등록할것이라면 git add 를 통해 Staging Area 로 전달
  • Staging Area 로 전달한것을 다시 복구시키고싶다면

    • git restore --staged <file> : Staging Area → Untracked (git add 이전)

3. 파일 삭제 시나리오:Remove(rm)

  • Tracked : Git 이 추적하는 파일 중 삭제 시나리오

  1. 명령어로 삭제하기 git **rm** <file>
    • Staging Area 로 바로 올려 Commit 시 바로 삭제되도록
      • Git Repository 에서 삭제 예정(Staging) + Local 에서 삭제
  2. 파일을 그냥 삭제하기 (마우스 우클릭이든, 리눅스 명령어든)
    • Unstaged 에 올려 개발자가 한번 검토한 후 Staging Area 에 올리도록
      • Git Repository 에서 삭제 검토(Unstaged) + Local 에서 삭제
  3. 명령어로 삭제하기 git **rm --cached** <file>
    • Staging Area 로 바로 올려 Commit 시 바로 삭제되도록함과 동시에 Untracked 에서 나만 보기
      • Git Repository 에서 삭제 예정(Staging) + Local 에서 사용
        • Git 에서만 확실하게 없애고, 내 로컬에서 나만 사용할 파일에 사용
          • 민감 정보가 포함되어있는 Credential 이나 .env 과 같은 개인 설정 파일들

4. Git Add 와 Restore : 파일 추가, 삭제, 수정 시나리오 별

  • Git ADD : 어떤곳에서든 Staging Area 로 보낼때 사용

  • Git RESTORE : Staging Area 혹은 Unstaged 에서 이전 상태로 롤백 시 사용

    1. --staged 옵션에 따라 Staging Area 에서 롤백할지 Unstaged 에서 롤백할지 결정

    2. 추가, 삭제, 수정 시나리오에 따라 이전 상태가 달리 정의

    • --staged 옵션이 있으면 : Staging Area 에서 롤백

      • 삭제할 파일의 이전 상태 = Unstaged 에서 대기 : Staging Area 에서 → Unstaged 로 이동
      • 수정된 파일의 이전 상태 = Unstaged 에서 대기 : Staging Area 에서 → Unstaged 로 이동
      • 추가된 파일의 이전 상태 = Untracked : Staging Area 에서 → Untracked 로 이동
    • --staged 옵션이 없으면 : Unstaged 에서 롤백 (아무일도 없던것처럼 깨끗히 롤백)

      • 삭제할 파일의 이전 상태 = 미삭제(존재) : Unstaged 에서 → 기존 Git 이 추적하던 파일 존재
      • 수정된 파일의 이전 상태 = 미수정 : Unstaged 에서 → 기존 Git 이 추적하던 파일의 이전 상태

0개의 댓글