reflog로 git reset --hard 복구하기
각 블록은 다른 경우이며 하나의 실행 스크립트가 아닙니다. 저장소에 맞는 경우를 선택하고 브랜치 이름, 경로와 VERIFIED_COMMIT을 바꾸세요. 중단 명령은 해당 작업이 진행 중일 때만 사용하며 두 대안을 모두 실행하지 마세요.
핵심 답변
git reset --hard 후에는 reflog에서 이전 커밋을 찾아 확인하고 복구 브랜치를 만듭니다. 해당 커밋 객체가 아직 남아 있어야 합니다.
예시와 전제 조건
이 과정은 커밋한 작업을 복구합니다. 작업 디렉터리에만 있던 미커밋 변경은 reflog에 저장되지 않습니다.
변경 전에 상태 확인
추가 reset, rebase, 브랜치 전환을 멈춥니다. 참조를 옮기기 전에 git reflog를 읽고 git show로 내용을 확인하세요.
git status --short
git reflog --date=iso
git show VERIFIED_COMMIT참조나 별도 체크아웃 보존
VERIFIED_COMMIT에 rescue/lost-work를 만듭니다. 현재 브랜치와 작업 파일을 바꾸지 않고 찾은 커밋에 참조를 부여합니다.
git branch rescue/lost-work VERIFIED_COMMIT
git log -5 --oneline rescue/lost-work첫 번째 절차
복구 브랜치의 기록과 패치를 검토합니다. 다른 checkout에서 확인하거나 필요한 변경을 선택해 통합할 수 있습니다.
다른 결과를 의도적으로 선택
복구 커밋으로 직접 reset하면 브랜치, 인덱스, 파일이 다시 바뀝니다. 먼저 현재 변경과 복구 참조를 보존하세요.
제한과 예외
HEAD@{1}은 reflog의 위치이며 올바른 커밋을 보장하지 않습니다. ORIG_HEAD에 이전 끝이 남을 수 있지만 다른 작업이 덮어쓸 수 있습니다.
충돌과 정리
reflog 만료와 객체 정리는 별도로 설정하는 정책입니다. 오래된 기록이 남아 있어도 삭제된 객체를 다시 만들 수는 없습니다.
결과 확인
복구 브랜치의 커밋, 파일, 기록을 확인합니다. 변경을 통합하기 전에 관련 테스트를 실행하세요.
git show --stat rescue/lost-work
git status --short자주 묻는 질문
git revert는 반대 변경을 담은 새 커밋을 만들며 reset 이전 위치로 되돌리지 않습니다. 스테이지만 한 내용은 git fsck로 blob을 찾을 수 있지만 파일명과 구조는 보장되지 않습니다.
FluxGit에서 작업 검토
FluxGit의 Safety Timeline은 reflog 이동과 복원 지점을 모읍니다. 기능을 켜고 로컬 변경이 감지되면 지원되는 reset에서 안전 stash를 저장할 수 있습니다. 영상의 일반 터미널 reset에는 이 보호가 적용되지 않습니다.
Git 공식 문서
git reset --hard 되돌리기: 사라진 커밋 복구
git reset --hard 후 커밋 객체가 보존되어 있는 동안 로컬 reflog를 사용해 커밋된 변경을 복구할 수 있습니다. reflog가 만료되거나 객체가 정리된 후에는 복구가 보장되지 않습니다.
테스트 저장소에서 녹화했습니다.
내레이션 대본 읽기
- git reset --hard를 실행했더니 마지막 커밋이 사라졌습니다. 누구나 한 번쯤 하는 실수입니다. 복구하는 방법과 그 원리를 알려 드리겠습니다.
- 먼저 작업을 커밋합니다. 결제 호출을 두 번 재시도하도록 바꾼 작업입니다.
- 그다음 터미널에서 git reset --hard HEAD~1을 실행합니다.
- FluxGit이 즉시 감지합니다. 브랜치가 이전으로 이동했고, 그 커밋은 더 이상 브랜치 위에 있지 않습니다.
- 커밋이 사라지지 않은 이유는 이렇습니다. 브랜치는 커밋을 가리키는 이름표일 뿐입니다. reset은 이름표를 뒤로 옮기지만 커밋은 저장소에 남고, Git의 일기인 reflog에도 기록되어 있습니다. 그 커밋에 브랜치를 만들면 되찾을 수 있습니다.
- FluxGit의 Recover lost work는 이해하기 쉬운 말로 설명하고 필요한 위치로 안내합니다.
- Safety Timeline은 reset을 한 문장으로 보여 줍니다. reset 직전 시점에서 브랜치를 만듭니다.
- 커밋이 별도의 브랜치에 돌아왔습니다.
- 커밋하지 않은 작업은 reflog에 기록되지 않습니다. 복구 지점이 활성화되어 있고 로컬 변경 사항이 감지되면, FluxGit은 hard reset 전에 안전용 stash를 저장할 수 있습니다. 이 예제에서 터미널에 직접 실행한 일반 Git reset은 그 보호 절차를 거치지 않습니다.
- 터미널에서도 같습니다. git reflog에서 reset 직전 항목을 찾고, 그 커밋에 브랜치를 만듭니다.
- 요약하겠습니다. reset은 이름표를 옮깁니다. reflog는 이름표가 있던 위치를 기억합니다. 커밋을 보존하려면 브랜치를 만드세요. 다음 수업에서는 삭제된 브랜치를 복구합니다.