어느 날 밤, 코드를 수정하여 커밋을 푸시했다. 사내 보안 시스템은 내 코드에서 보안 정보를 찾아냈고 나에게 알람이 전송되었다.
나는 git reset HEAD^를 하고 push origin 브랜치 --force를 날렸다.
push를 하고 나니 내가 선배의 커밋까지 reset를 시키고 원격 리모트를 업데이트 시켰다는 것을 깨달았다. 그 순간 자리에서 일어나 소리를 질렀고 머리를 쥐어 뜯으며 내 덤벙거림을 탓했다. 나는 혼란스러운 마음에 침대에 누워 천장을 바라보았다. "아... 망했네..." 탄식이 절로 나올 수 밖에 없는 상황이였다.
그리고 멍을 때리다 지푸라기라도 잡는 심정으로 검색을 했다.
그리고 git reflog라는 것을 발견하고 터미널에 치니 remote에서 pull받고 merge된 커밋이 내 로컬에 남아있었다.
그날, 결과적으로는 선배의 커밋을 되돌려놨고 무사히 푸시까지 마쳤다.
git reflog란?
git의 레퍼런스 로그를 보여주는 명령어로 git에서 HEAD포인터가 변경된 모든 사항을 기록한다. 이 로그는 git에 대한 수정 명령어 후의 HEAD의 변화 뿐만 아니라 체크아웃이나 리셋같은 작업도 기록되는 것이 특징이다.
주요 기능과 사용 사례
- 삭제된 브랜치 복구: 브랜치를 실수로 삭제한 경우, git reflog를 사용하여 삭제된 브랜치의 마지막 커밋을 찾고, 새 브랜치를 그 커밋으로 다시 시작할 수 있다. 정말 좋은 기능이다.
- 잘못된 리베이스, 리셋, 머지 되돌리기: 잘못된 Git 명령어 실행 후 상태를 되돌리고 싶을 때, git reflog를 사용해 이전 상태의 커밋 ID를 찾아 해당 상태로 되돌릴 수 있다.
- 손실된 커밋 찾기: 작업 중인 커밋을 잃어버렸거나 덮어쓴 경우, git reflog를 통해 해당 커밋을 찾아낼 수 있다.
사용 방법
- 기본 사용법: git reflog 명령어를 실행하면, 현재 로컬 저장소에서 발생한 최근 HEAD 변경 목록을 보여준다.
- 상세 정보 조회: git reflog show <branch> 명령어를 사용하면, 특정 브랜치의 reflog를 조회할 수 있다.
- 특정 시점으로 되돌리기: git reset --hard HEAD@{n} 명령어를 사용하여, n번째 이전의 상태로 HEAD를 되돌릴 수 있습니다. 여기서 n은 git reflog 출력에서 원하는 상태의 인덱스다.
예제
- 잘못된 커밋 후 되돌리기:
git reflog
# 이전 상태의 인덱스 확인, 예를 들어 HEAD@{2}라고 가정
git reset --hard HEAD@{2}
- 삭제된 브랜치 복구:
git reflog
# 삭제된 브랜치의 마지막 커밋 찾기
git branch <새로운-브랜치-이름> <삭제된-브랜치의-마지막-커밋-ID>
주의 사항
- git reflog는 로컬 저장소에만 존재하며, 다른 사용자와 공유되거나 원격 저장소에 푸시되지 않는다.
- git gc (가비지 컬렉션) 명령어를 실행하면 오래되거나 필요 없는 객체를 정리하기 때문에, 일부 git reflog 항목이 삭제될 수 있다.
이 글은 git reflog를 만든것으로 추정되는 두 분께 받칩니다. 너무 감사한 분들인거 같다.
'개발 > Git' 카테고리의 다른 글
[Git] Git flow 정리 및 실습 (0) | 2022.02.15 |
---|