# Git 명령어에 따른 .git 내부 구조 변화(1부)
---
## 1. `git merge` 시 내부 변화
### 1.1 예시 명령어
```bash
git checkout main
git merge feature
```
### 1.2 `.git` 내부 변화
구성 요소
| 변화 내용
|
---|
`.git/objects/`
| 병합 결과로 새로운 ****merge commit**** 객체 생성
|
`.git/refs/heads/main`
| 브랜치 포인터가 merge 커밋으로 이동
|
`.git/HEAD`
| 여전히 `ref: refs/heads/main` 유지
|
`.git/MERGE_HEAD`
| 병합 대상 커밋(`feature`) 해시 저장 (병합 중일 때 생성됨)
|
`.git/logs/HEAD`
| HEAD의 이동 이력 반영됨 (reflog)
|
### 1.3 도식 예시
```
A---B---C ← main
\
D---E ← feature
▶ git merge feature
결과:
A---B---C-------M (merge commit) ← main, HEAD
\ /
D---E
```
---
## 2. `git rebase` 시 내부 변화
### 2.1 예시 명령어
```bash
git checkout feature
git rebase main
```
### 2.2 `.git` 내부 변화
구성 요소
| 변화 내용
|
---|
`.git/objects/`
| `feature`의 커밋들을 기반 변경 후 새 커밋으로 ****재작성****
|
`.git/refs/heads/feature`
| 브랜치가 새 커밋들로 덮어씀
|
`.git/REBASE_HEAD`
| 리베이스 기준 커밋을 기록
|
`.git/HEAD`
| 여전히 `ref: refs/heads/feature`
|
`.git/logs/HEAD`
| HEAD의 커밋 재작성 이력 반영됨
|
### 2.3 도식 예시
```
main: A---B---C
feature: D---E
▶ git rebase main
결과:
main: A---B---C
feature: D'---E' ← HEAD
```
> 원래 커밋 D, E는 삭제되지 않고 `.git/objects`에 보존됨
---
## 3. `git reset` 시 내부 변화
### 3.1 예시 명령어
```bash
git reset --hard HEAD~1
```
### 3.2 `.git` 내부 변화
구성 요소
| 변화 내용
|
---|
`.git/refs/heads/main`
| 브랜치 포인터가 이전 커밋으로 이동
|
`.git/HEAD`
| 여전히 `ref: refs/heads/main`
|
`.git/index`
| 되돌린 커밋 시점으로 스테이징 영역 초기화
|
작업 디렉토리
| `--hard`인 경우 파일도 초기화
|
`.git/ORIG_HEAD`
| 이전 HEAD 커밋 해시를 저장
|
`.git/logs/HEAD`
| 이동 전후 이력 기록됨
|
### 3.3 도식 예시
```
A---B---C ← main, HEAD
↑
ORIG_HEAD
▶ git reset --hard B
결과:
A---B ← main, HEAD
```
---
## 4. 특수 HEAD 파일 요약
파일 이름
| 생성 시점
| 설명
|
---|
`.git/MERGE_HEAD`
| `git merge` 수행 중
| 병합 대상 커밋 해시 저장
|
`.git/REBASE_HEAD`
| `git rebase` 수행 중
| 기준 커밋 해시 저장
|
`.git/ORIG_HEAD`
| `git reset`, `merge` 등
| 리셋 전 커밋 백업
|
`.git/FETCH_HEAD`
| `git fetch` 이후
| 원격에서 받아온 커밋들 정보
|
`.git/CHERRY_PICK_HEAD`
| `git cherry-pick` 중 충돌 시
| 적용 대상 커밋 기록
|
---
## 5. 요약 비교표
명령어
| 커밋 이동
| 브랜치 이동
| HEAD 변경
| 디렉토리 영향
| 특수 파일 생성
|
---|
`merge`
| ⭕
| ⭕
| ⭕
| 충돌 시 변동 있음
| `MERGE_HEAD`
|
`rebase`
| ⭕ (rewrite)
| ⭕
| ⭕
| 충돌 시 변동 있음
| `REBASE_HEAD`
|
`reset --hard`
| ⭕ (이전 커밋으로)
| ⭕
| ⭕
| ✔️ 완전 초기화
| `ORIG_HEAD`
|
---
#####