Git | GitLab

[Git] Detached HEAD란

비번변경 2023. 4. 18. 22:05

개요

어느 날, Git 레포지터리 변경 사항이 원격 레포지터리로 push 되지 않아 확인해 보니 아래와 같은 상태였다…….

아무래도 레포지터리가 브랜치를 가키리는 게 아닌 것 같은데, 관련해서 알아본다.

 

 

Detached HEAD란

Git에서 HEAD는 현재 checkout한 commit을 참조한다. 일반적으로 master, main과 같이 이름이 붙은 branch를 참조한다. 그리고 branch는 특정 commit을 참조한다. 이렇게 HEAD -> branch - commit 순으로 commit을 참조하는 상태를 attached HEAD 상태라고 한다.

반면 Detached HEAD란 HEAD가 branch를 통해 commit을 참조하는 상태가 아니라, 직접 commit을 참조하는 상태를 말한다.

Detached HEAD 상태로 만들 때는 아래 명령을 사용하면 된다.

git checkout origin/main
git checkout HEAD~2

Detached HEAD 상태에서도 Git 작업을 정상적으로 수행할 수 있는데, 만약 다른 branch로 checkout 하면 가비지 콜렉터에 의해 commit이 삭제된다. 만약 commit의 revision number를 모르면 쉽게 돌아갈 수 없고, 그래프에도 표시되지 않아 주의해야 한다.

 

 

만약 다른 branch로 checkout했다면

HEAD가 이동했던 히스토리를 확인하여 commit을 확인할 수 있다.

git reflog

 

그리고 명령어를 잘 만들면 그래프로도 확인할 수 있다.

git log --graph --decorate $(git rev-list -g --all)

 

commit을 유지하려면

새 branch를 생성해 주면 된다. Git이 공식적으로 권장하는 방법이기도 하다.

git checkout -b <new branch name>

 

commit을 기존 branch에 반영할 때는 rebase를 이용하면 좋다.

git checkout <branch>

git rebase <new_branch>

 

 

참고 문서

http://sunphiz.me/wp/archives/2266

https://velog.io/@ss-won/Git-Detached-Head

https://git-scm.com/docs/git-checkout

728x90