Git 핵심 개념 레퍼런스
Git 4대 오브젝트
Git의 모든 동작은 단 4종류의 오브젝트 생성과 연결로 이루어진다.
| 오브젝트 | 역할 |
|---|---|
| Blob | 파일 내용 저장. 파일명·경로 없이 내용만. SHA-1 해시로 식별 |
| Tree | 디렉토리 구조. 파일명·권한·blob 포인터를 담는다 |
| Commit | 특정 시점 스냅샷. tree 포인터 + 부모 커밋 + 메타데이터 |
| Tag | 특정 커밋에 붙이는 고정 라벨 (v1.0.0 등) |
Git의 작업 영역
Working Directory → (git add) → Staging Area → (git commit) → Repository
| 영역 | 설명 |
|---|---|
| Working Directory | 실제 파일이 있는 공간 (.git 제외) |
| Staging Area (Index) | git add한 변경 사항 대기열 |
| Repository (.git) | 커밋된 스냅샷 저장소 |
파일 상태
- Untracked:
git add한 번도 안 한 신규 파일 - Staged: 스테이징 영역에 올라온 상태
- Unmodified: 최신 커밋과 동일한 상태
- Modified: 최신 커밋 이후 변경된 상태
HEAD와 브랜치의 관계
HEAD는 현재 작업 위치를 가리키는 포인터다.
HEAD → main → commit_abc
브랜치 전환 시:
git checkout feature
HEAD → feature → commit_xyz
브랜치를 새로 만들고 커밋하면 흐름이 갈라진다:
main → A → B → C
feature → A → B → D → E
git merge feature를 실행하면 두 흐름을 합친 merge commit이 생성된다.
Detached HEAD
HEAD가 브랜치가 아닌 특정 커밋을 직접 가리키는 상태다.
git switch [커밋해시] --detach
이 상태에서 커밋하면 어느 브랜치에도 속하지 않는 orphan commit이 생긴다. 해당 커밋을 보존하려면 새 브랜치를 만들어야 한다:
git branch -f main HEAD # main을 현재 HEAD로 이동
git checkout main # 또는 새 브랜치 생성자주 쓰는 명령어
git log --oneline --graph # 히스토리 그래프로 보기
git diff HEAD # 마지막 커밋 이후 변경사항
git stash # 작업 임시 저장
git stash pop # 임시 저장 복원
git cherry-pick [해시] # 특정 커밋만 가져오기
git rebase -i HEAD~3 # 최근 3개 커밋 편집
git reset --soft HEAD~1 # 커밋 취소 (변경사항 유지)
git reset --hard HEAD~1 # 커밋 취소 (변경사항 삭제)