개발자일기/스쳐간 오류

[Git] Detatched HEAD 상태

뫙뭉 2022. 3. 7. 09:29
반응형

오류 발생 이유

첫 프로젝트를 마치고 부푼 마음으로 README.md 파일을 업데이트 해야겠다고 마음먹고 깃허브 리퍼지토리에서 직접 수정을 진행하였다. 처음 수정해본 파일이기 때문에 역시나 문제가 발생하였다.

깃허브에서도 수정을 하고 local에서도 파일을 수정하니 나중에 커밋 시 충돌이 발생 한 것.

당황한 나머지 어정쩡하게 알고있던 GUI인 Sourcetree를 통해 이것저것 만지다가 merge를 성공했나 싶었더니 이상한 오류와 함께 커밋이 되지 않는 상태가 발생하였다.

 

날 당황하게 했던 오류 메세지
GUI에는 어떻게든 해결해 보려 발악 했던 흔적들이...

뭣도 몰랐던 나는 branch 그래프만 보면 이게 왜 안되는 건가 도대체... 절망스럽기만 했으나 침착하게 detached head라는 오류 메시지를 구글링해 보았다.

Detached HEAD 상태란?

출처: Dog발자 블로그 , http://sunphiz.me/wp/archives/2266

 

깃의 Detached HEAD – Dog발자

Detached HEAD란? 보통 브랜치(branch)는 특정 커밋(commit)의 revision number를 가리키고 HEAD가 이 브랜치를 가리킨다. 이렇게 HEAD -> 브랜치 -> 특정 커밋 순서로 commit을 가리키는 상태를 ‘attached HEAD’ 상태

sunphiz.me

보통의 브랜치는 HEAD가 브랜치를, 그 브랜치가 리비전넘버를 가리키는 attached HEAD 상태이다. 그러나 중간의 브랜치 없이 HEAD가 직접 리비전넘버를 가리키고 있는 상태가 detached HEAD 상태이다.

위의 상태를 이해했다면 어느 정도 해결법을 유추할 수 있다.

그렇다 detached HEAD 의 브랜치를 설정해주면 다시 attached HEAD 가 되어 정상적으로 merge 할 수 있는 상태가 된다.

해결방법

우선 내가 어떤 브랜치 위에 서있는지 확인할 필요가 있다.

지금 여긴 어디..?

별표시가 되어 있는 부분이 내가 지금 위치하고 있는 브랜치. 하지만 현재 상태는 브랜치 명 대신에 이상한 문구가 써있는 이상한 상태이다.

 

내가 가장 걱정했던 부분은 내가 그후에 커밋했던 내용은 다 날아간 것인가..?

구글링 결과 다행히도 내가 커밋했던 내용은 사라지지 않는다라는 문구를 발견하고 안도의 한숨을 내쉬었다.

그럼 마지막으로 커밋했던 부분으로 시간(?)이동 할 필요가 있겠다. 

$ git reflog

해당 명령어를 치면 내가 진행했던 깃 로그들을 간략하게 보여준다.

이런 식으로 간단하게 보여주는 기능이 git reflog

여기서 앞에 노란색으로 보이는 부분이 git 의 revision이다.

$ git checkout <revision>

위의 명령어를 치면 내가 커밋했던 내용의 상태로 이동 할 수 있다.

$ git checkout -b 브랜치이름

그 후에 위의 명령어로 브랜치를 만들어 현재 detached 상태를 해제하면 브랜치가 만들어지고 이후 정상적으로 merge를 진행하면 문제는 해결된다.

master브랜치로 이동 -> git merge <브랜치이름> 으로 merge 진행

 

뫄무리

해당 오류를 접했을 때 진짜 당황했던 기억이 난다.

현업에 있는 지인한테 전화해서 물어보기도 하고 혼자 GUI로 이것저것 만지다가 커밋이 날아간 것 같은 엄청난 절망도 느꼈다. 구글링하다 찾은 '커밋한 내용은 날아가지 않는다'는 문구가 나에게 가뭄의 단비같은 말이었다 이말이다.

팀 프로젝트 경험이 거의 없는 나로서는 git add, commit, push 말고는 사용해 본 적이 없기에 더욱 당황했던 것 같다.

하지만 정확히 어떤 이유에서 이러한 오류가 발생하였는지는 아직 의문. 이 부분에 대해서는 더 알아볼 필요가 있다.

 

이번 기회를 통해 git에 대해서도 더 공부할 수 있는 좋은 기회였던 것 같다.

반응형