Data-Driven System Development/Git

Git Reset과 Checkout의 동작 원리 완벽 이해하기

Data Jun 2025. 3. 21. 09:33

 Git을 사용하다 보면 resetcheckout을 자주 사용하게 됩니다. 하지만 이 두 개념을 헷갈리는 경우가 많습니다. 이번 글에서는 git reset과 git checkout의 동작 원리를 그림과 함께 쉽게 설명하겠습니다.

 

Git에서 HEAD와 브랜치의 관계

Git에서 **브랜치(branch)**는 특정 커밋을 가리키는 포인터입니다. 그리고 HEAD는 보통 브랜치를 가리키며, 이를 통해 특정 커밋을 간접적으로 가리키는 구조입니다. 아래 그림처럼 HEAD는 보통 master 브랜치를 통해 최종 커밋을 가리킵니다.

 

git reset을 실행하면?

지금 4개의 커밋이 있고, HEAD는 master 브랜치를 통해 마지막 커밋(43kf)을 가리키고 있다고 가정해 봅시다.

git reset 9033

 

이 명령어를 실행하면 아래와 같이 변화합니다.

git reset 9033 실행 후

변화 내용:

  • HEAD는 여전히 master 브랜치를 가리킨다.
  • 하지만 master 브랜치가 9033 커밋을 가리키도록 이동한다.
  • 결과적으로 HEAD가 간접적으로 가리키던 커밋도 변경됨.

 중요한 점
git reset을 실행해도 이후의 커밋(43kf)은 삭제되지 않습니다! 다만, 브랜치가 가리키지 않을 뿐입니다.

 

 

git checkout을 실행하면?

이번에는 git checkout을 사용해 보겠습니다.

git checkout 9033

이렇게 실행하면 HEAD는 브랜치를 가리키는 것이 아니라 9033 커밋을 직접 가리키게 됩니다.

📌 git checkout 9033 실행 후 (Detached HEAD)

Detached HEAD 상태란?

  • HEAD가 더 이상 브랜치를 가리키지 않고, 특정 커밋(9033)을 직접 가리킴.
  • 이 상태에서 새로운 커밋을 하면 master 브랜치와 별개의 히스토리가 생성됨.

 

Detached HEAD에서 새로운 브랜치 만들기

 

Detached HEAD 상태에서 새로운 브랜치를 만들고 싶다면?

git branch premium

이 명령어를 실행하면 현재 HEAD가 가리키던 커밋(9033)에 새로운 premium 브랜치가 생성됩니다.

새로운 브랜치 premium 생성

변화 내용:

  • premium 브랜치가 생성되고, HEAD가 가리키던 커밋(9033)을 가리킴.
  • 하지만 HEAD는 여전히 Detached 상태.

 

HEAD를 새로운 브랜치로 이동하기

 

새로 만든 premium 브랜치로 이동하려면 다음 명령어를 실행합니다.

git checkout premium

그러면 HEAD가 premium 브랜치를 가리키게 되며, Detached 상태에서 벗어납니다.

 HEAD가 premium 브랜치를 가리키는 상태

이제 HEAD가 premium 브랜치를 가리키고 있는 정상적인 상태가 되었습니다.
이 상태에서 커밋을 하면 premium 브랜치의 새로운 히스토리가 생성됩니다.

 

 

master 브랜치와 분리된 커밋을 생성하면?

이제 premium 브랜치에서 새로운 커밋을 생성하면 어떻게 될까요?

git commit -m "새로운 기능 추가"

그러면 premium 브랜치는 새 커밋을 가리키지만, master 브랜치는 여전히 기존 커밋을 가리키고 있습니다.

 master와 다른 새로운 커밋을 가진 premium 브랜치

이제 premium 브랜치는 새로운 커밋을 포함하는 독립적인 브랜치가 되었습니다.

이제 premium 브랜치와 master 브랜치는 서로 다른 히스토리를 가지게 됩니다.
필요하면 git merge로 합칠 수 있습니다.

 

git reset vs git checkout 비교

마무리: git reset과 checkout을 활용하자!

이제 git reset과 git checkout의 차이를 확실히 이해하셨나요?

✅ git reset은 브랜치가 가리키는 커밋을 변경하는 명령어
✅ git checkout은 HEAD가 가리키는 대상(커밋 or 브랜치)을 변경하는 명령어

이를 잘 활용하면 실수를 되돌리고, 원하는 시점에서 새로운 브랜치를 만들 수 있습니다. 

이제 Git을 더욱 자유롭게 활용해 보세요! 😃