# 명령어 # HEAD vs main (+특수 HEAD 종류 정리) --- ## 1. 개요
용어 | 역할 | 예시 |
---|---|---|
`HEAD` | 현재 작업 중인 커밋을 가리키는 포인터 | `HEAD → main` 또는 `HEAD → <커밋 해시>` |
`main` | 기본 브랜치 이름 (Git 2.28+ 기본 브랜치) | `main → C3 커밋` |
항목 | `HEAD` (포인터) | `main` (브랜치) |
---|---|---|
정체 | 특수 포인터 | 이름 있는 참조 |
용도 | "현재 내가 작업 중인 위치" 추적 | 커밋들을 연결하는 선 |
이동 가능성 | ****하나만 존재****, 항상 이동함 | 여러 브랜치 중 하나, 직접 이동 안 함 |
Git 명령어 관련 | `reset`, `checkout`, `reflog` | `merge`, `push`, `checkout` 대상 |
실제 저장 위치 | `.git/HEAD` | `.git/refs/heads/main` |
상태 | 설명 | 결과 |
---|---|---|
Attached HEAD | HEAD가 브랜치를 가리킴 | ✅ 정상 상태 ( `HEAD → main` ) |
Detached HEAD | HEAD가 특정 커밋 해시를 직접 가리킴 | 🌀 브랜치가 아님, 새 커밋은 임시 상태 |
명령어 | 설명 |
---|---|
`git symbolic-ref HEAD` | HEAD가 가리키는 브랜치 경로 확인 |
`cat .git/HEAD` | HEAD 내용 확인 ( `ref: refs/heads/main` ) |
`git log` | HEAD 기준 커밋 히스토리 확인 |
`git reflog` | HEAD 이동 이력 추적 (복구용) |
구분 | `HEAD` | `main` |
---|---|---|
유형 | 포인터 (현재 위치) | 브랜치 이름 |
갯수 | 항상 1개 | 여러 개 가능 |
의미 | 현재 체크아웃된 브랜치/커밋 | 브랜치(커밋 선형 연결) |
이동 가능 여부 | 명령어로 이동 가능 | 직접 이동 불가 (커밋 시 이동) |
이름 | 설명 |
---|---|
`HEAD` | 현재 작업 중인 커밋 (or 브랜치) 포인터 |
`FETCH_HEAD` | `git fetch` 시 받아온 ****원격 커밋 참조**** |
`MERGE_HEAD` | `git merge`진행 중, 병합 대상 커밋 참조 |
`ORIG_HEAD` | 직전의 `HEAD`가 가리키던 위치 백업 (ex. `reset ` 이전 커밋) |
`CHERRY_PICK_HEAD` | `cherry-pick`도중 충돌 시 저장되는 대상 커밋 |
`REBASE_HEAD` | `rebase` 도중 기준이 되는 커밋 저장 |
`.git/HEAD` | 현재 위치 추적 |
`.git/ORIG_HEAD` | reset/merge 전 원래 HEAD |
`.git/FETCH_HEAD` | fetch로 받아온 최신 원격 커밋 위치 |
`.git/MERGE_HEAD` | merge 병합 대상 커밋 |
항목 | 설명 |
---|---|
` | 가장 가까운 태그 이름 |
` | 태그 이후 몇 번째 커밋인지 (0이면 태그 본인) |
`g<해시>` | 해당 커밋의 Git short hash |
용어 | 설명 |
---|---|
현재 브랜치 | 병합이 ****적용될 대상**** 브랜치 |
`<브랜치명>` | 병합할 ****소스 브랜치**** (변경사항을 가져올 브랜치) |
항목 | 설명 |
---|---|
HEAD 위치 | 항상 병합될 대상 브랜치에 있어야 함 (`git checkout <대상브랜치>`) |
충돌 가능성 | 변경사항이 겹치는 경우 ****conflict**** 발생 가능 → 수동 해결 필요 |
커밋 전 병합 여부 | 병합 대상 브랜치의 작업이 커밋되지 않았다면 병합되지 않음 |
상황 | 설명 |
---|---|
🔧 버그 수정 | `main`에서 수정한 버그 커밋을 `release` 브랜치에도 적용 |
🎯 기능 분리 | 여러 기능 중 하나만 따로 적용 |
🧪 실험 | 실험용 브랜치에 특정 수정만 적용해서 테스트 |
명령어 | 적용 범위 | 히스토리 영향 | 특징 |
---|---|---|---|
`merge` | 전체 브랜치 | O (병합 커밋 생성) | 원본 히스토리 유지 |
`rebase` | 전체 브랜치 | O (히스토리 수정) | 깔끔한 직선형 히스토리 |
`cherry-pick` | 개별 커밋 | O (복제 커밋 생성) | 선택 적용 가능 |
옵션 | 설명 |
---|---|
`--rebase` | 병합 대신 리베이스로 히스토리 깔끔하게 유지 |
`--no-commit` | 병합하되 커밋은 직접 하고 싶을 때 |
`--strategy=ours` / `theirs` | 충돌 시 우선할 히스토리 선택 |
옵션 | HEAD 이동 | Staging Area 변경 | 작업 디렉토리 변경 |
---|---|---|---|
`--soft` | ✅ O | ❌ 그대로 | ❌ 그대로 |
`--mixed` | ✅ O | ✅ 초기화 | ❌ 그대로 |
`--hard` | ✅ O | ✅ 초기화 | ✅ 완전 초기화 |
명령어 | 기존 커밋을 | 새로운 커밋? | 안전성 | 사용처 |
---|---|---|---|---|
`reset` | ****삭제함**** | ❌ X | 위험 | 혼자 쓰는 브랜치, 최근 실수 복구 |
`revert` | ****보존함**** | ✅ O | 안전 | 협업 브랜치, 히스토리 보존 필요 시 |
옵션 | 설명 | 주의 사항 |
---|---|---|
`--soft` | 커밋만 취소, staging은 그대로 | 메시지 실수 복구에 유용 |
`--mixed` | 커밋 + staging 취소, 작업물은 유지 | 기본값 |
`--hard` | 커밋 + staging + 작업물 전부 취소 | ****되돌릴 수 없음**** \*주의 |
항목 | 브랜치 | 태그 |
---|---|---|
역할 | 작업을 이어가는 지점 | 이정표(마일스톤) 고정 지점 |
상태 | 계속 이동함 (새 커밋이 생기면 이동) | 고정됨 (절대 이동하지 않음) |
커밋 가능 여부 | 가능 | 불가능 (태그에서 커밋 시 분리된 HEAD) |
대표적 용도 | 기능 개발, 병합 관리 | 릴리즈, 버전 마킹 |
목적 | 명령어 예시 |
---|---|
태그 생성 | `git tag v1.0.0` |
주석 태그 | `git tag -a v1.0.0 -m "메시지"` |
태그 보기 | `git tag` |
태그 푸시 | `git push origin v1.0.0` |
태그 전체 푸시 | `git push origin --tags` |
태그 삭제 | `git tag -d v1.0.0` |
원격 태그 삭제 | `git push origin --delete tag v1.0.0` |
태그 기준 커밋 설명 | `git describe` |
명령어 | 설명 |
---|---|
`git reflog` | HEAD, 브랜치 이동 이력 확인 |
`git reset --hard HEAD@{n}` | 과거 커밋 상태로 복원 |
`git checkout -b <이름> HEAD@{n}` | 복구 브랜치 생성 (더 안전) |