HEAD란 현재 체크아웃된 커밋, 즉 현재 작업 중인 커밋을 가리킨다.
HEAD는 작업 트리의 가장 최근 커밋을 가리키며 작업 트리에 변화를 주기 위해서 git 명령어는 HEAD를 변경하는 것으로 시작한다.
HEAD를 브랜치 대신 커밋에 붙이는 것을 의미한다.
커밋은 각각의 해시를 갖고 있으며 이를 통해 이동할 수 있다.
git checkout [커밋이름]
명령어 사용 시 헤드가 커밋 자체를 가리킬 수 있게 한다.
하지만 커밋트리가 실제 작업환경에서는 보이지 않기 때문에 해시를 확인하기 위해 git log 명령어를 사용해야하며 해시는 길기 때문에 입력도 쉽지 않다.
다행히도 Git은 긴 해시의 고유값을 보여줄 수 있는 만큼만 명시해줘도 인식은 할 수 있다.
해시로 구분하는 것은 불편하기 때문에 상대적으로 우리가 기억할 만한 지점에서 출발해서 이동해 다른 지점에 도달해서 작업을 할 수 있다.
기억할 만한 지점은 특정 브랜치나 HEAD가 될 수 있다.
참조 이름에 하나 추가할 때마다 명시한 커밋의 부모를 찾게 된다.
git checkout main^
- main
의 부모로 HEAD 이동
git checkout main^^
- main
의 조부모로 HEAD 이동
위로 올라가고 싶은 만큼의 숫자를 명시해서 부모를 찾는 연산자
git checkout main~4
- main
에서 4번째 이전 커밋으로 HEAD 이동
git branch -f [브랜치명] [이동할 위치]
브랜치를 강제로 이동할 위치에 해당하는 커밋을 가리키게 한다.
HEAD의 위치는 바뀌지 않는다.
-f
: 강제 명령
이동할 위치
: 상대적인 위치(^,~를 이용한 위치) 혹은 해시를 사용할 수 있다.
git reset [이동위치]
브랜치가 예전의 커밋을 가리키도록 이동시키는 방식
애초에 커밋하지 않은 것처럼 옮겨 히스토리를 고쳐쓴다.
git revert HEAD
로컬 브랜치의 경우 reset을 사용하기 편하지만 히스토리를 고쳐쓰기 때문에 타인과 작업하는 리모트 브랜치에는 쓰기 쉽지 않다.
git revert는 변경 내용을 되돌리고 되돌린 내용을 다른 사람들과 공유한다.
타 브랜치에서 가져오고 싶은 커밋들을 가져와 현재 브랜치에 적용하는 명령어
rebase
는 공통 조상이되는
git cherry-pick [커밋이름1][커밋이름2][커밋이름3]
현재 HEAD 밑에 커밋이름1,2,3을 추가한다.
원하는 커밋이 무엇인지, 각각의 해시값을 알고 있다면 간단하게 사용가능하다
하지만 원하는 커밋이 무엇인지 모를 시는 사용이 어렵다.
git rebase -i [이동위치]
인터렉티브 리베이스란 rebase
시에 -i
옵션을 함께 사용하는 것이다.
-i
옵션 추가 시 리베이스를 도와줄 수 있는 UI 창을 띄우게 된다.
인터렉티브 리베이스 UI의 기능은 다음과 같다.
pick
을 이용해 지정명령어 수행 시 선택한 커밋 중 가장 하위 단계 커밋을 브랜치가 가리키게 된다.
중요한 지점들에 특정 커밋들을 브랜치로 참조하듯이 영구적인 이정표로 표시하는 기능
Git 태그 생성 시 커밋들이 추가되어도 절대 움직이지 않고 태그를 checkout 했을 시에는 작업을 완료할 수 없다.
git tag [지정할 태그이름] [위치]
git tag에서 상대적으로 어디에 위치해 있는 지 묘사해주는 명령어로 커밋 히스토리에서 방향 감각을 잡는데 도움을 준다
git describe <ref>
<ref>
은 커밋을 뜻하는 어떤 것이던 쓸 수 있다.
ref를 특정짓지 않을 시 현재 HEAD를 사용한다.
명령어 입력 후
부모태그_태그와의 거리_g태그의 해시값
형태로 값을 출력하게 된다.
만약에 현재 태그에 위치해 있다면 태그 이름만 나오게 된다.