yeoseon / tip-archive

트러블 슈팅 및 팁을 모아두는 레포 (Today I Learned)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[Git] Staging area는 왜 중요한가.

yeoseon opened this issue · comments

Git의 영역

Git 디렉터리, 워킹 트리, Staging Area

image

Git 디렉터리

Git 디렉터리(.git 디렉터리, 깃 저장소)

git init 명령으로 .git이라는 이름으로 생성된다.
Git 프로젝트의 모든 메타데이터와 객체 데이터베이스가 저장된다.
Git의 핵심
git clone을 통해 원격 저장소를 복사해서 가져올 때 이 .git 디렉터리를 만들고, 원격 저장소의 모든 데이터를 복사하여 가져온다.

워킹 트리

Git 디렉터리에서 특정 버전을 checkout해온 것.
우리는 이곳에서 프로젝트 작업을 진행하게 된다.

Staging Area

실제로는 Git 디렉터리에 파일로 존재한다.
Index영역이라고도 한다.
워킹트리에서 작업한 내용이 Git 디렉터리에 Commit 되기 전까지 거쳐가는 공간.
이 곳을 거치지 않고 바로 Commit 될 수도 있다.

Git으로 하는 일 (3가지 상태)

  1. 워킹 트리에서 파일을 수정한다.
  2. Staging Area에 파일을 Stage해서, 커밋할 스냅샷을 만든다. (모든 파일을 추가할 수도 있고 선택하여 추가할 수도 있다.)
  3. Staging Area에 있는 파일들을 커밋해서 Git 디렉터리에 영구적인 스냅샷으로 저장한다.

상태 정리

  • Git 디렉터리에 있는 파일들은 Committed 상태이다.
    • Committed란 데이터가 로컬 데이터베이스에 안전하게 저장됐다는 것을 의미한다.
  • 파일을 수정하고 Staging Area에 추가했다면 Staged이다.
    • Staged란 현재 수정한 파일을 곧 커밋할 것이라고 표시한 상태를 의미한다.
  • Checkout 하고 나서 수정했지만, 아직 Staging Area에 추가하지 않았으면 Modified 이다.
    • Modified는 수정한 파일을 아직 로컬 데이터베이스에 커밋하지 않은 것을 말한다.

Git Staging area는 왜 중요한가??

git status
git diff --staged
add

저장소에 커밋되기 전에, 반드시 거쳐야만 하는 중간단계.
다른 버전관리 도구에는 이에 정확히 대응하는 개념은 없다.(커밋될 예정인 파일의 내용을 기억하는..)

일부분만 커밋할 때

워킹 디렉토리에서는 자유롭게 고치고 싶다.
커밋할 때는 골라서 커밋하고 싶다.
Staging area가 없다면, 커밋을 할 때 커밋할 파일만 선택해야 한다.

충돌을 해결할 때

충돌이 발생했을 때 해결을 위한 작업 데이터를 Staging Area에 저장해두는 것이 좋다.
svn도 마찬가지로 어떤 파일이 충돌했는지 '파일 상태'를 기억한다.
하지만 Git은 파일 단위로 충돌을 기억는게 아니라서, 필요한 만큼만 충돌 해소 후 그 부분만 add 하여 커밋하면 된다.

커밋 다시 하기

커밋을 다시할 때 로그메시지만 고치는 것이 아니라 파일들도 좀 고치고 싶다면
commit --amend 전에 파일을 고쳐서 add하기만 하면 된다.

Reference

Git의 기초
Git 에서 세 가지 영역
Effective Git
Git Staging Area는 어떤 점이 유용한가.
The thing about git