지금 바로 할 일
- 휴지통을 확인하고, 원격 저장소에 푸시했다면 저장소를 다시 클론합니다.
- .git 폴더가 남아 있다면 git restore·git reflog·git stash 로 파일과 커밋을 되돌립니다.
- 커밋하지 않은 작업은 VS Code 타임라인이나 JetBrains 로컬 기록을 먼저 보고, 그다음 USB에서 실행한 도구로 드라이브를 검사합니다.
단계별 방법
빌드를 멈추고 휴지통 확인
그 드라이브에서 패키지 설치, 빌드, 테스트를 실행하지 마세요. 수천 개의 파일을 씁니다. 먼저 휴지통을 봅니다. 파일 탐색기나 많은 IDE에서 지운 파일은 보통 휴지통으로 가지만, rm -rf, del, Remove-Item, git clean 같은 명령은 휴지통을 거치지 않습니다.
원격 저장소에서 다시 클론
프로젝트를 GitHub, GitLab 등 서버에 푸시했다면 새 폴더에 다시 클론합니다. 커밋하고 푸시한 내용은 모두 그대로 돌아옵니다. 빠지는 것은 푸시하지 않은 로컬 작업뿐입니다.
.git 폴더가 남았다면 git 사용
일부 파일만 지웠다면 git status 가 그 목록을 보여 주고, git restore 뒤에 경로를 적으면 대개 마지막으로 커밋한 판이 돌아옵니다. 실수로 git reset --hard 를 했다면 git reflog 에서 이전 커밋을 찾아 되돌아갈 수 있습니다. 잠시 치워 둔 작업은 git stash list 로 확인하세요. git add 로 스테이징만 하고 커밋하지 않은 파일은 git fsck --lost-found 로 찾을 수 있는 경우가 있습니다.
편집기 로컬 기록 확인
VS Code에서는 파일의 타임라인 보기를 엽니다. 로컬 기록은 프로젝트와 따로 보관됩니다. 지운 파일이라면 같은 경로에 빈 파일을 만들면 이전 기록이 나타나는 경우가 많습니다. JetBrains IDE에서는 프로젝트 폴더를 오른쪽 클릭해 Local History 의 Show History 를 열면, 지운 파일이 목록에 나오고 되돌릴 수 있습니다.
드라이브에서 폴더 검사
USB에 넣은 포터블 FileFix Ultimate를 실행하고 삭제 파일 복구를 열어 드라이브를 고른 뒤 균형 검사를 시작합니다. 폴더 트리에서 프로젝트 경로로 이동하거나 cs, py, js, ts, java 같은 확장명으로 거릅니다. 의존성 폴더와 빌드 폴더는 다시 만들 수 있으니 건너뛰세요.
다른 곳에 저장하고 코드 확인
복구한 폴더를 다른 물리 디스크에 저장합니다. 새 위치에서 열어 빌드와 테스트를 실행하고 git diff 로 원격과 비교하세요. 일부가 덮어써진 채 돌아온 파일도 언뜻 보면 멀쩡해 보일 수 있습니다.
git이 디스크 검사보다 대개 나은 이유
.git 폴더에는 추적하는 모든 파일의 커밋된 모든 판이 압축되어 들어 있습니다. 이 폴더가 로컬이든 원격이든 남아 있는 한, 커밋된 코드는 사실상 잃어버린 것이 아니며 알맞은 명령만 쓰면 됩니다. 그래서 .git 이 든 프로젝트 폴더를 통째로 지우는 것이 파일 몇 개를 지우는 것보다 훨씬 아픕니다. 푸시하지 않았다면 기록도 함께 사라지기 때문입니다.
커밋하지 않은 변경은 다릅니다. git이 한 번도 본 적이 없으므로 현실적인 출처는 편집기 로컬 기록, 저장하지 않은 탭의 편집기 백업, 그리고 디스크 자체입니다. FileFix Ultimate의 저장 못 한 파일 찾기는 VS Code와 Notepad++ 의 백업 사본도 찾으며, 편집기가 닫힐 때 열려 있던 탭의 코드가 남아 있을 수 있습니다.
복구 검사로 소스 파일에 할 수 있는 것과 없는 것
사진과 문서는 알아볼 수 있는 머리 부분으로 시작해서, 파일 시스템이 잊어버려도 시그니처 검색으로 찾을 수 있습니다. 소스코드는 그런 머리 부분이 없는 일반 텍스트입니다. 코드는 파일 시스템 기록에 달려 있습니다. 지운 폴더의 NTFS 항목이 남아 있으면 이름, 경로, 폴더 구조가 함께 돌아오고, 그 항목이 재사용되었다면 텍스트 파일은 사실상 찾을 수 없습니다.
NTFS에서 아주 작은 파일은 파일 기록 안에 직접 저장되는 경우가 많아서, 큰 파일은 사라져도 짧은 설정 파일과 소스 파일은 남는 일이 있습니다. 프로젝트 안의 이미지, 압축 파일, SQLite 데이터베이스 같은 이진 파일은 시그니처로 찾을 수 있지만 이름은 없습니다.
WSL이나 가상 머신 안의 프로젝트
WSL 2 안에 둔 코드는 보통 ext4.vhdx 라는 가상 디스크 파일 속 ext4 파일 시스템에 있습니다. wsl --shutdown 을 실행한 뒤 그 파일을 다른 디스크로 복사하고 사본을 여세요. FileFix Ultimate는 VHDX 이미지를 열고 ext4를 읽기 전용으로 읽을 수 있습니다. ext4에서 지운 파일은 NTFS보다 이름과 함께 되살리기 어려우므로 확실한 방법이라기보다 시도해 볼 만한 기회로 보세요. 가상 머신의 VMDK, VHDX, QCOW2 디스크도 같은 방법으로 열 수 있습니다.
복구가 안 되는 경우
- 개발용 PC는 대부분 TRIM이 동작하는 SSD를 써서, 지운 파일이 거의 바로 지워질 수 있습니다. 그러면 커밋하지 않은 코드는 되돌릴 수 없을 수 있습니다.
- 삭제 뒤 같은 드라이브에서 패키지 설치나 빌드를 실행했다면 빈 공간이 이미 다시 쓰였을 가능성이 큽니다.
- 파일 시스템 기록이 남아 있지 않으면 일반 텍스트 소스 파일은 시그니처로 찾을 수 없습니다.
- 커밋도 푸시도 하지 않았고 편집기 기록에도 없는 작업은 디스크 공간이 덮어써지면 돌아갈 사본이 없습니다.
FileFix Ultimate가 돕는 방법
- 복구량 제한이 없고 개인 사용은 무료이며, USB에서 실행되는 포터블 버전이 있어 개발용 드라이브에 새로 쓰지 않습니다.
- NTFS, FAT32, exFAT 기록에서 지운 폴더 트리를 다시 만들고, 기록이 남아 있으면 파일 이름과 경로를 유지합니다.
- 저장 못 한 파일 찾기로 저장하지 않은 편집기 탭의 VS Code·Notepad++ 백업을 찾습니다.
- WSL이나 가상 머신에 둔 코드를 위해 VHDX, VMDK, QCOW2 이미지를 열고 ext4를 읽기 전용으로 읽습니다.
FileFix Ultimate는 개인 사용이 무료이고 오프라인으로 동작하며, 복구 대상 드라이브에는 아무것도 쓰지 않습니다. 업무용은 PC 1대당 1년 라이선스가 필요합니다. 실행 전에 디지털 서명을 확인하세요.
자주 묻는 질문
git reset --hard 를 해 버렸습니다. 커밋을 되찾을 수 있나요?
대개 가능합니다. git reflog 를 실행해 리셋 전의 커밋을 찾고, 그 커밋에 브랜치를 만들거나 그곳으로 되돌리세요. 커밋하지 않은 변경은 reflog 에 없고, 스테이징한 것만 git fsck 로 찾을 수 있는 경우가 있습니다.
git clean 으로 지운 파일은 휴지통으로 가나요?
아니요. git clean 은 추적하지 않는 파일을 바로 지우므로 휴지통에 나타나지 않습니다. 남은 방법은 편집기 로컬 기록이나 디스크 검사입니다.
node_modules 와 빌드 폴더도 복구해야 하나요?
아니요. 프로젝트 파일과 잠금 파일로 다시 만들 수 있으므로 소스를 되찾은 뒤 다시 설치하는 편이 빠르고 안전합니다. 빼고 복구하면 결과도 작아져 확인이 빨라집니다.
복구한 파일의 이름과 폴더가 그대로인가요?
파일 시스템 기록으로 찾은 경우에는 그렇습니다. 소스 파일은 다른 방법으로는 찾을 수 없으므로, 폴더 트리에 나타난 파일이라면 대개 이름도 함께 나타납니다.