# 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`
--- #####