[Git] Reflog란? (32)

2023. 2. 16. 13:00Git & Github

반응형

Reflog란?


Git Reflog는 HEAD의 위치가 변경될 때마다 log를 기록한다. .git 폴더의 logs > HEAD에 들어가면 새로운 커밋을 하거나 브랜치를 이동하거나, 혹은 특정 커밋으로 움직일 때 로그가 기록되는 걸 확인할 수 있다.

 

Reflog 명령어의 한계

log는 자신의 로컬 pc에서 일어나는 작업만 기록하기 때문에 공동 작업자와 log를 공유할 수 없다는 단점을 가지고 있다.

더군다나 log는 영구적으로 유지되는 기록이 아닌 90일 정도 보관 후 사라진다.

 

 

명령어

git reflog show HEAD

or

git reflog

 

git reflog 명령어는 show, expire, delete, exist와 같은 추가 명령어를 더해 사용한다. show 명령어만 흔히 사용되고 나머지는 잘 사용되지 않는다.

git reflog show 명령어로 HEAD나 특정 브랜치를 지정해 로그를 확인할 수 있다.

 

 

 

예시

 

git show HEAD

 

명령어를 입력한 후 터미널의 모습이다. HEAD의 모든 변경사항을 로그로 남겨놨다. 상단의 로고가 가장 마지막(최근 시점)에 변경된 사항이고 아래로 내려가면 갈수록 이전의 데이터이다.(최근 -> 이전)

 

 

References


Reflog References

특정 로그를 name@{qualifier}로 검색하여 찾을 수 있다. 이러한 방법은 checkout, reset, merge, diff 명령어에서도 사용된다.

한 가지 주의해야 할 점은 HEAD~1과 HEAD@{1}과는 다르다는 점이다. HEAD~1은 가장 마지막에 이루어진 커밋(조상커밋)에서 1번째 전 커밋을 이야기하는 것이라면 HEAD@{1}은 최근에 기록된 로그에서 1번째 전 로그를 이야기하는 것이다. 

로그는 커밋을 기록하는 것뿐만 아니라 브랜치를 변경하거나, detached HEAD 모두 기록하기 때문에 구별해서 사용해야 한다.

 

 

 

git reflog HEAD@{2}

 

해당 명령어를 사용하면 HEAD@{2} ~ 과거 데이터까지 출력된다.

 


Timed References

시간 및 기간을 이용해서 참조 로그를 찾을 수 있다.

 

 

예시

  • 1.day.ago
  • 3.minutes.ago
  • yesterday
  • Fri, 12 Feb 2021 14:06:21 -0800

 

 

복구하기


reset 복구하기

reflog 명령어를 이용하면 git reset으로 제거됐던 commit를 복구할 수 있다.

git reset --hard <commit-hash> 명령어를 사용하게 되면 해당 커밋 이후의 커밋들은 모두 사라지게 된다.

 

 git reset --hard master@{Num}

 

그러나 위의 명령어를 사용하게 되면 특정 커밋을 재복구 할 수 있다.

 


rebase 복구하기

git rebase -i 명령어를 사용하면 commit한 기록을 정리할 수 있지만 실수로 합치거나 삭제한 게 있다면 reflog 명령어로 복구할 수 있다.

 

1. 해당 브랜치의 로그를 들여다보면 이전에 기록했던 모든 커밋들이 저장되어 있는 것을 확인할 수 있다.

 

git reflog show master

 

 

2. 돌아가고 싶은 커밋이 있다면 해쉬번호나 특정 참조를 복사하여 명령어를 사용하면 복구할 수 있다.

 

 git reset <commit-hash>

 

반응형