# HEAD vs main (+특수 HEAD 종류 정리) --- ## 1. 개요
용어 역할 예시
`HEAD` 현재 작업 중인 커밋을 가리키는 포인터 `HEAD → main` 또는 `HEAD → <커밋 해시>`
`main` 기본 브랜치 이름 (Git 2.28+ 기본 브랜치) `main → C3 커밋`
--- ## 2. 개념 비교
항목 `HEAD` (포인터) `main` (브랜치)
정체 특수 포인터 이름 있는 참조
용도 "현재 내가 작업 중인 위치" 추적 커밋들을 연결하는 선
이동 가능성 ****하나만 존재****, 항상 이동함 여러 브랜치 중 하나, 직접 이동 안 함
Git 명령어 관련 `reset`, `checkout`, `reflog` `merge`, `push`, `checkout` 대상
실제 저장 위치 `.git/HEAD` `.git/refs/heads/main`
--- ## 3. 시각적 예시 ``` A---B---C---D ↑ main ↑ HEAD ``` - `HEAD → main → D 커밋` - `git checkout main``HEAD``main` 브랜치를 가리킴 - `git checkout <커밋 해시>``HEAD`****Detached 상태**** --- ## 4. HEAD의 두 가지 상태
상태 설명 결과
Attached HEAD HEAD가 브랜치를 가리킴 ✅ 정상 상태 ( `HEAD → main` )
Detached HEAD HEAD가 특정 커밋 해시를 직접 가리킴 🌀 브랜치가 아님, 새 커밋은 임시 상태
```bash git checkout main # HEAD → main git checkout a1b2c3d # HEAD → a1b2c3d (Detached) ``` --- ## 5. 관련 명령어
명령어 설명
`git symbolic-ref HEAD` HEAD가 가리키는 브랜치 경로 확인
`cat .git/HEAD` HEAD 내용 확인 ( `ref: refs/heads/main` )
`git log` HEAD 기준 커밋 히스토리 확인
`git reflog` HEAD 이동 이력 추적 (복구용)
--- ## 6. 요약 비교표
구분 `HEAD``main`
유형 포인터 (현재 위치) 브랜치 이름
갯수 항상 1개 여러 개 가능
의미 현재 체크아웃된 브랜치/커밋 브랜치(커밋 선형 연결)
이동 가능 여부 명령어로 이동 가능 직접 이동 불가 (커밋 시 이동)
--- ## 7. 특수 HEAD 종류 정리
이름 설명
`HEAD` 현재 작업 중인 커밋 (or 브랜치) 포인터
`FETCH_HEAD` `git fetch` 시 받아온 ****원격 커밋 참조****
`MERGE_HEAD` `git merge`진행 중, 병합 대상 커밋 참조
`ORIG_HEAD` 직전의 `HEAD`가 가리키던 위치 백업 (ex. `reset ` 이전 커밋)
`CHERRY_PICK_HEAD` `cherry-pick`도중 충돌 시 저장되는 대상 커밋
`REBASE_HEAD` `rebase` 도중 기준이 되는 커밋 저장
--- ## 8. 활용 예시 ```bash git reset --hard ORIG_HEAD # 직전 상태로 롤백 git merge feature # 병합 시 MERGE_HEAD 생성됨 cat .git/MERGE_HEAD # 병합 대상 커밋 확인 git fetch origin # FETCH_HEAD 갱신 cat .git/FETCH_HEAD ``` --- ## 요약
`.git/HEAD` 현재 위치 추적
`.git/ORIG_HEAD` reset/merge 전 원래 HEAD
`.git/FETCH_HEAD` fetch로 받아온 최신 원격 커밋 위치
`.git/MERGE_HEAD` merge 병합 대상 커밋
---