[GIT] git chekout --> Detached HEAD (커밋을 잃어버렸다.)

2023. 3. 12. 14:14GIT

[문제 발생]

마지막 커밋 후에 빼먹은 기능이 있는 것 같아서 이전 커밋으로 돌아가 새로운 작업을 시도하려 했다.
<main브랜치>는 이미 가장 최근 커밋으로 이동한 상태여서 이전 코드로 돌아가기 위해서는 커밋의 tag name을 타고 돌아가보았다. --> git checkout <tag name>

그랬더니, 다음과 같은 문구를 주며 이전 커밋으로 돌아올 수 있었다.

새로운 작업을 커밋하다가 <main 브랜치>로 돌아와 병합하려고 보니까 커밋 내용이 없어졌다...

--all 명령어를 사용해도 보이지 않는다.

 

[문제해결 1]

우선 해당 커밋으로 돌아가기 위해서는 전체 기록을 살펴볼 필요가 있었다.

git reflog

위 명령어를 사용하면 브랜치 유무를 떠나 HEAD가 지나갔던 히스토리를 모두 볼 수 있다.

# 이런 방법도 있다. 참고
git log --graph --decorate $(git rev-list -g --all)

하지만 해당 커밋으로 돌아가거나 볼 수는 있지만 해당 커밋을 이용해 작업을 하기 위해선 브랜치가 필요했다.

 

[문제해결 2]

해당 커밋에 브랜치를 심어주면 해결될 문제라고 생각했다.

git reflog로 히스토리를 확인 후 tag name을 통해 사용할 커밋으로 이동했다. 그리고 해당 커밋에서 브랜치를 만들어 주었다.

git checkout [이동할 tag name]
git branch [생성할 브랜치 name]

이렇게 하면 다시 <main 브랜치>로 이동해도 log --all 명령어로 히스토리를 볼 수 있었고 merge 등의 작업도 진행할 수 있었다. 즉, 커밋을 살릴 수 있었다. 

 

윈위의 두 과정을 한 줄로 해결이 가능하다.

git checkout -b [생성할 브랜치명]

 

[참고]

아래의 명령어를 사용하면 commit 이 Detached HEAD 상태가 된다.

git checkout master^
git checkout HEAD~2
git checkout origin/master
git checkout <tag name>
git checkout <revision number>

'GIT' 카테고리의 다른 글

[GIT] 커밋 메시지 타입  (0) 2023.04.13
github flow  (0) 2023.03.03
git merge 충돌, 덮어쓰기  (0) 2023.02.28
git branch / git merge  (0) 2023.02.27
.gitigonre 경로 제외하기 / push 취소하기  (0) 2023.02.24