피드로 돌아가기
Dev.toDevOps
원문 읽기
Git 저장소 손상 시 reflog와 원격 저장소를 활용해 커밋 히스토리를 복구하는 방법
How to Recover from a Corrupted Git Repository
AI 요약
Context
디스크 장애, 프로세스 강제 종료, 파일시스템 버그 등으로 .git/objects/ 디렉토리의 객체 파일이 손상되면 git status 실행 시 "fatal: bad object HEAD" 같은 오류가 발생한다. 사용자는 수주간의 커밋 히스토리가 완전히 손실됐다고 인식하게 된다.
Technical Solution
- 손상 범위 파악:
git fsck --full --no-dangling명령으로 손상된 객체의 SHA 해시와 타입을 정확히 식별 - Reflog를 통한 복구: .git/logs/HEAD에 저장된 90일 분의 브랜치 포인터 이력에서 마지막 유효한 커밋을 찾아
git reset --hard로 되돌림 - 원격 저장소에서 객체 재다운로드: 손상된 객체 파일을 별도 디렉토리로 이동한 후
git fetch origin으로 원격에서 객체를 다시 받음 - 손상된 Blob 재구성: 작업 트리에 해당 파일이 존재하면
git hash-object -w명령으로 객체 저장소에 다시 기록 - Packfile 손상 복구:
git unpack-objects와git verify-pack으로 손상된 패킹된 객체에서 온전한 것만 추출하고 원격에서 부족분을 받음
Key Takeaway
Git의 내용 주소 지정 저장소 구조(content-addressable object store)는 모든 클론을 자동 백업으로 만들고 개별 객체가 자체 검증되므로, 대부분의 손상은 국소화되어 복구 가능하다. .git/objects/ 작동 원리를 이해하면 저장소 손상을 15분 내에 해결할 수 있다.
실천 포인트
Git 저장소를 관리하는 팀에서 `git push` 빈도를 높이고, git gc나 git repack 중단을 피하며, core.fsync 설정을 활성화하고 주기적으로 `git fsck`를 실행하면 손상 상황에서 reflog와 원격 저장소를 통해 신속한 복구가 가능하다.