[GIT] git chekout --> Detached HEAD (커밋을 잃어버렸다.)
2023. 3. 12. 14:14ㆍGIT
[문제 발생]
마지막 커밋 후에 빼먹은 기능이 있는 것 같아서 이전 커밋으로 돌아가 새로운 작업을 시도하려 했다.
<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 |