버전관리는 디버깅을 위한 것이다.
그 동안 내가 HEAD와 main에 대해 아는 것은 이정도였다.
Head: 현재를 가리키며, Head가 가리키는 버전이 부모
main: 마지막 최신 버전
당연한 이야기 같지만 HEAD에 대해 생각해 본적이 없어서 의미를 정확히 알아봤다.
현재 내 git 상태
로컬에서만 작업되었으며 4번의 commit을 하였고 현재는 main이 HEAD를 가리키는 마지막 커밋 상태이다.
상위 버전으로 checkout했을 때
Git Graph에서 v3 커밋에 우클릭하여 Checkout하였다.

결과

터미널 명령어: git log

leture로 commit한 내용은 보이지 않고 HEAD가 checkout한 v3을 가리키고 있다.

최신 상태라면 HEAD가 main을 가리키고 있는 것이 보통의 상태이다.

위의 사진대로 HEAD가 main을 가리키지 않고 HEAD가 최신 버전을 직접 가리키고 있다.
이것을 detached head state라고 부른다.
detached head state에서 다음 커밋을 진행한다면 어떻게 될까?
커밋 2개를 더 진행해 보았다. v5와 v6로 내용으로 커밋된 것을 볼수 있다.

터미널 명령어: git log

HEAD와 main이 서로 바라보는 버전이 달라졌다.
HEAD는 최신 버전을 가리키지만 main은 여전히 lecture를 가리키고 있다.
이 상태로 main branch로 바꾸면 어떻게 될까?
브랜치 변경 방법
1. Git Graph에서 main을 더블클릭하기
2. 터미널에서git checkout main입력

Git Graph상에 전에 작업한 v5, v6 커밋이 모두 사라졌다.
그렇다면 v6 최신 버전으로 가리키려면 어떻게 해야 할까?
사실 v5, v6는 사실 사라진게 아니라 안 보이는 것일 뿐이다.
결론적으로는 되돌아 가고자하는 commit ID를 알아야 한다. 정확히는 commit hash 값이다. 따로 기록해 두지 않았더라도 다행히 이전 git log 내용에서 commit ID를 확인할 수 있다.
터미널 입력: git checkout <commit_hash>


처음으로 돌아가서 HEAD, main으로 작업하는 것이 어떤 의미인지 알고 사용해야 한다. detached head state에서 모르고 작업을 계속 했다가 다 날라가는 경우가 생길 수 있다.
우리는 main branch와는 별개로 다른 작업을 해보고 싶을때 사용하는게 새로운 브랜치 생성이다. 이러한 이유로 git branch 브랜치명 을 통해 브랜치를 생성하고 시작하는 것 같다.
git branch를 추가하면(dev 브랜치 생성함) main브랜치로 checkout을 하더라도 하위 버전들이 사라지지 않았다.

Git Graph에서는 [reset current branch to this commit] 를 사용하여 변경 가능하다.

터미널에서 명령어로 실행할 경우 아래와 같이 작성한다.
git reset --hard <commit_hash>
이것만은 기억해두자!
cheackout은 HEAD가 가리키는 곳을 변경한다
reset은 branch를 이동시킨다
훌륭한 글 감사드립니다.