오늘은 git 안에서 노드들을 여기저기 이동할때 간편하게 이동하는 방법을 알아볼 것이다. 그전에 head의 개념을 먼저 알고 넘어가자~
HEAD는 현재 checkout된 commit을 가리킨다. 즉 현재 작업중인 commit이다. HEAD는 항상 작업트리의 가장 최근 commit을 가리키는데 작업트리에 변화를 주는 git의 명령어들은 대부분 HEAD를 변경하는 것으로 시작한다. HEAD를 분리한다는것은 HEAD를 branch 대신 commit에 붙이는 것을 의미하는데
git checkout C1
을 하게 되면 HEAD - main - C1
의 구조에서 HEAD - C1
의 구조로 변경할 수 있다.
git의 상대참조 종류에는 두가지의 간단한 방법이 있다.
- 한 commit 위로 움직이는 `^` // 캐럿 연산자
- 여러 commit 위로 올라가는 `~ branchName`
캐럿(^)연산자는 branch명 뒤에 하나씩 추가하게 되면 명시한 commit의 부모를 찾아간다.
git checkout main^ //main의 한단계 위의 부모
git checkout main^^ //main의 두단계 위의 부모 즉 부모의부모
커밋트리에서 한번에 여러단계를 올라가고 싶을 경우에는 ^
를 여러번 사용하는것 보다는 틸드(~)연산자를 사용하는게 좋다.
git checkout HEAD~4 //돌아가고 싶은 commit의 갯수를 ~뒤의 숫자로 명시한다.
상대참조를 사용하는 가장 일반적인 방법은 branch를 옮길때 -f 옵션을 사용해서 branch를 특정 commit에 직접적으로 재지정 하는 것이다.
git branch -f main HEAD~3
위 명령어를 적용한 예시를 살펴보면 한번에 branch 강제(-f)를 통해 main
을 HEAD(C4안에 감춰져 있음)위 3단계 부모의 위치로 재지정 된것을 확인할 수 있다.