본문 바로가기
■Development■/《Etc》

[Etc] Git에서 HEAD 의미

by 은스타 2022. 9. 28.
반응형

Git에서 HEAD란? 초보자를 위한 완벽 가이드

안녕하세요.

이번 포스팅은 Git을 사용할 때 자주 마주치게 되는 'HEAD'에 대해 알아보겠습니다. Git을 배우는 과정에서 HEAD라는 용어를 보셨다면, 이 글이 여러분에게 큰 도움이 될 것입니다.


#1. HEAD란 무엇인가?

Git에서 HEAD는 현재 작업 중인 브랜치의 최신 커밋을 가리키는 포인터입니다. 쉽게 말해, HEAD는 "지금 내가 있는 위치"를 나타냅니다. 이것은 마치 책갈피처럼 Git에게 "여기를 보고 있어요"라고 알려주는 역할을 합니다.

 

#2. HEAD의 기본 개념

Git 저장소를 사용할 때, HEAD는 항상 존재합니다. 기본적으로 HEAD는 다음과 같은 특징을 갖습니다:

  1. 브랜치 포인터: 일반적으로 HEAD는 현재 체크아웃된 브랜치를 가리킵니다.
  2. 최신 커밋 참조: HEAD가 가리키는 브랜치의 가장 최근 커밋을 참조합니다.
  3. 작업 디렉토리의 기준점: 작업 디렉토리의 상태는 HEAD가 가리키는 커밋을 기준으로 결정됩니다.

 

#3. HEAD 확인하기

현재 HEAD가 어디를 가리키고 있는지 확인하려면 다음 명령어를 사용할 수 있습니다:

git log --oneline

이 명령을 실행하면 가장 위에 있는 커밋(최신 커밋)이 HEAD가 가리키는 커밋입니다. 또는 다음 명령어로도 확인 가능합니다:

git show HEAD

 

#4. HEAD의 다양한 상태

1. 일반적인 HEAD (Attached HEAD)

일반적으로 HEAD는 브랜치를 가리키고, 그 브랜치는 특정 커밋을 가리킵니다. 예를 들어:

HEAD -> master -> 최신 커밋(abc1234)

이 상태에서 새로운 커밋을 만들면, master 브랜치는 새 커밋을 가리키도록 이동하고 HEAD는 여전히 master를 가리킵니다.

2. 분리된 HEAD (Detached HEAD)

특정 커밋을 직접 체크아웃하면 'Detached HEAD' 상태가 됩니다. 이 상태에서 HEAD는 브랜치가 아닌 특정 커밋을 직접 가리킵니다.

git checkout abc1234

이 명령 후 Git은 "You are in 'detached HEAD' state"라는 메시지를 표시합니다. 이 상태에서 새 커밋을 만들면, 그 커밋들은 어떤 브랜치에도 속하지 않게 되어 나중에 찾기 어려울 수 있습니다.

HEAD를 활용한 상대 참조

Git에서 HEAD를 기준으로 상대 참조를 사용할 수 있어 매우 편리합니다:

  • HEAD^: HEAD의 부모 커밋 (바로 이전 커밋)
  • HEAD~2: HEAD에서 2단계 이전 커밋
  • HEAD~3: HEAD에서 3단계 이전 커밋

예를 들어, 이전 커밋으로 되돌리고 싶다면:

git reset HEAD^

 

#5. 주요 Git 명령어와 HEAD

1. git checkout

브랜치나 커밋을 체크아웃하면 HEAD가 이동합니다:

git checkout master  # HEAD가 master 브랜치를 가리킴
git checkout feature # HEAD가 feature 브랜치를 가리킴

2. git reset

HEAD의 위치를 변경하고 작업 디렉토리의 상태를 조정합니다:

git reset --soft HEAD~1  # HEAD를 한 단계 이전으로 이동, 작업 디렉토리는 유지
git reset --hard HEAD~1  # HEAD를 한 단계 이전으로 이동, 작업 디렉토리도 이전 상태로 변경

3. git revert

HEAD가 가리키는 커밋의 변경사항을 취소하는 새 커밋을 생성합니다:

git revert HEAD  # 최신 커밋의 변경사항을 취소하는 새 커밋 생성

 

#6. HEAD와 브랜치의 관계 이해하기

Git에서 브랜치는 단순히 특정 커밋을 가리키는 포인터입니다. HEAD는 대부분의 경우 브랜치를 가리키고, 그 브랜치가 특정 커밋을 가리킵니다.

새 커밋을 만들면:

  1. 새 커밋의 부모는 현재 HEAD가 가리키는 커밋이 됩니다.
  2. 현재 브랜치는 새 커밋을 가리키도록 업데이트됩니다.
  3. HEAD는 여전히 현재 브랜치를 가리킵니다.

실전 예제: HEAD 활용하기

실수로 한 커밋 되돌리기

git reset --soft HEAD^  # 최신 커밋을 취소하되 변경사항은 스테이징 영역에 유지

3개 커밋 전으로 완전히 되돌리기

git reset --hard HEAD~3  # 3개 커밋 전으로 완전히 되돌림 (주의: 변경사항 모두 삭제)

특정 파일만 이전 상태로 되돌리기

git checkout HEAD^ -- file.txt  # file.txt만 이전 커밋 상태로 되돌림

주의사항: HEAD를 다룰 때 알아두어야 할 점

  1. Hard Reset 주의: git reset --hard는 작업 디렉토리의 변경사항을 모두 삭제하므로 주의해야 합니다.
  2. Detached HEAD 상태: 이 상태에서 작업할 때는 나중에 브랜치를 만들어 커밋을 보존하는 것이 좋습니다.
  3. Push 후 Reset 위험: 이미 원격 저장소에 푸시한 커밋을 리셋하면 팀원들과 충돌이 발생할 수 있습니다.

정리

Git에서 HEAD는 현재 작업 중인 브랜치의 최신 커밋을 가리키는 포인터로, Git 작업의 기준점 역할을 합니다. HEAD를 이해하면 커밋 간 이동, 변경사항 추적, 실수 복구 등 Git의 다양한 기능을 더 효과적으로 활용할 수 있습니다.

이제 Git에서 HEAD의 개념과 활용법을 이해하셨나요? 이 지식을 바탕으로 더 자신감 있게 Git을 사용하시길 바랍니다!

긴 글 읽어주셔서 감사합니다.

끝.

 

 

추가 학습 자료

  • Git 공식 문서
  • Pro Git 책
  • 인터랙티브 Git 학습 사이트

 

반응형