이 사이의 복잡한 관계를 알아보자.
checkout vs reset
이 둘은 닮은 듯 안닮은 친구들이다.
이번 시간은 지적인 허영을 채우기 위함이니 그냥 듣자.
우리가 저장소를 만들게 되면 기본적으로 head 라는 것이 들어진다.
그리고 저장소를 만들면 기본적으로 master branch가 생성이 되고, 기본적으로 이 branch 위에서 버전을 만들고 기본적으로 head 는 master를 가르킨다.
그리고 버전을 만들게 되면 현재 master 브랜치에 있는 상태로 버전을 만들었기 때문에 버전 1을 가르킨다.
우리가 head를 확인하는 방법은
클라이언트 마다 다른데 command line 에서는
log 로 확인하고
sorce tree에서는 점으로 표시가 된다.
현재 저장소가 어떤 버전인지 알고싶다면, head가르키는 master가 가르키는 버전을 보고 알 수 있다.
만약 버전 2를 생성할 경우
이제 master branch가 숫자 2를 가르키게 된다
현재 버전을 head 를 따라 master를 따라 가면서 확인할 수 있다.
만약 새로 google branch를 만들었을경우?
어떤 버전으로 시작할지를 정해야 하는데,
google 브랜치는 2번으로 시작하는 구나를 git이 안다
이때 checkout을 통해 branch를 바꾸면
현재 저장소는 google 이라는 것, 그리고 버전은 2라는 것을 알 수 있다.
그리고 버전 3을 만들면
현재 google 에 checkout 된 상태로 만들었기 때문에 branch는 이제 3번을 가르키게 된다.
즉 master가 가르키는 버전과 google이 가르키는 버전이 다른 것이다.
이상태에서 checkout master을 한다면 내부적으로는
head가 가르키는 것을 master로 옮기고 저장소를 버전2로 바꾼다는 것이다.
즉 이것을 통해 알 수 있는 것은 checkout이라는 것은 결국 head의 값을 바꾼다는 것을 알 수 있다.
따라서 head를 master 와 beanch로 바꿀 수 있지만 만약
checkout 1 이라고 하면 head는 1번이라는 버전을 직접 가르킨다
head가 이렇게 커밋을 가르키는 상태를 detached 상태에 있다라고 이야기 한다.
결국 checkout이라는 것은 head를 제어하는 것이다.