Skip to main content

Git 명령어에 따른 .git 내부 구조 변화(1부)


1. git merge 시 내부 변화

1.1 예시 명령어


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 예시 명령어


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 예시 명령어


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