Dev/Git

[Git] Head, Relative Ref, reset, revert

창문닦이 2019. 2. 12. 23:53

1. HEAD

HEAD는 현재 checkout된 커밋(현재 작업중인 커밋) 을 가리킨다.고로 HEAD는 항상 작업트리의 가장 최근 커밋을 가리킨다. 작업트리에 변화를 주는 git 명령어들은 대부분 HEAD를 변경하는것으로 시작한다. 일반적으로 HEAD는 브랜치의 이름을 가리키고 있다. 커밋을 하게 되면, bugFix의 상태가 바뀌고 이 변경은 HEAD를 통해서 확인 가능함.

 

HEAD 분리하기

HEAD를 분리한다는 것 =  HEAD를 브랜치 대신 커밋에 붙이는 것을 의미

커밋에 붙은 라벨(C1, C2 등..)을 이용해서 head 분리 가능

 

git checkout master^

git checkout 브랜치명^

git checkout HEAD^

 

2. 상대 참조(Relative Ref.)

Git에서 여기저기 이동할 때 커밋의 해시를 사용하는 방법은 번거롭다. 매번 해시를 git log 명령어로 확인해야한다. 또한, 실제 Git에서는 해시들이 훨씬 더 길다. Git은 해시가 커밋의 고유한 값임을 보여줄 수 있을 만큼만 명시해주면 된다. 전체 긴 문자열 대신 fed2만 입력해도 된다.( 앞자리 4개 정도..)

 

커밋들을 해시로 구분하고 사용하는 것은 번거롭기 때문에 Git의 상대 참조(Relative Ref)가 등장한다! 상대 참조로 우리가 기억할 만한 지점(브랜치 bugFix라던가 HEAD라던가)에서 출발해서 이동하여 다른 지점에 도달해 작업을 할 수 있다.

 

상대 커밋의 두가지 방법

1. 한번에 한 커밋 위로 움직이는 ^

git checkout HEAD^

 

2. 한번에 여러 커밋 위로 올라가는 ~<num>

git checkout HEAD~4 (돌아가고싶은 커밋의 개수 : 4개) 

커밋트리에서 위로 여러 단계를 올라가고 싶을 때, Git 에는 틸드 (~) 연산자가 있다. 

(~) 틸드 연산자는 (선택적) 올라가고 싶은 부모의 갯수가 뒤에 숫자로 붙인다.

 

브랜치 강제로 옮기기

상대 참조를 사용하는 가장 일반적인 방법은 브랜치를 옮길 때. 

-f 옵션을 이용해서 브랜치를 특정 커밋에 직접적으로 재지정 할 수 있다.

 

git branch -f master HEAD~3

(강제로) master 브랜치를 HEAD에서 세번 뒤로 옮겼습니다. (three parents behind HEAD).

 

문제 풀이

 git checkout bugFix

$ git checkout HEAD^


3. Git에서 작업 되돌리기

변경내역을 되돌리는 것도 커밋과 마찬가지로 낮은 수준의 일(개별 파일이나 묶음을 스테이징 하는 것)과 높은 수준의 일(실제 변경이 복구되는 방법)이 있다, 실제 변경이 복구되는 방법은 아래와 같다.

Git에서 변경한 내용을 되돌리는 방법 두가지

git reset HEAD~1

 

git revert HEAD