빌드 산출물을 지우려다 작성 중이던 파일까지 날린 뒤 생긴 습관
문제 발생
브랜치를 옮길 때마다 남는 빌드 산출물을 정리하려고 검색해서 나온 명령을 그대로 실행했습니다.
git clean -fdx빌드 산출물은 사라졌는데, 아직 커밋하지 않은 새 파일과 로컬 설정(.env.local)도 함께 사라졌습니다. 되돌릴 방법은 없었습니다 — Git이 추적한 적 없는 파일이라 reflog에도 없습니다.
원인 분석
이 명령은 "정리"가 아니라 "삭제"입니다. Git 문서의 정의 그대로 — 현재 디렉터리부터 시작해 버전 관리되지 않는 파일들을 재귀적으로 제거해 작업 트리를 청소합니다.
플래그가 각각 범위를 넓힙니다.
-d— 문서 설명대로 기본적으로는 너무 많이 지우지 않기 위해 추적되지 않는 디렉터리로 재귀하지 않으며,-d를 주면 그 디렉터리까지 들어갑니다.-x— 표준 무시 규칙(.gitignore)을 사용하지 않아, 무시되던 파일까지 전부 지웁니다..env.local이 여기서 사라졌습니다.-X— 반대로 Git이 무시하는 파일만 지웁니다. 빌드 산출물만 치우고 수동으로 만든 파일은 남기고 싶을 때 쓰는 것이 이쪽입니다.
Git도 안전장치를 두고 있습니다 — clean.requireForce가 false로 설정돼 있지 않으면 -f 없이는 파일이나 디렉터리 삭제를 거부합니다. 우리가 -f로 그 장치를 끈 셈입니다.
해결 방안
- 항상
-n으로 먼저 봅니다. 문서 설명대로 아무것도 실제로 제거하지 않고 무엇이 지워질지 보여주며, 이때는clean.requireForce도 무시됩니다.
git clean -nd
git clean -ndx # 무시된 파일까지 포함하면 무엇이 사라지는지- 빌드 산출물만 지울 때는
-X입니다..gitignore에 있는 것만 지우므로 새로 만든 파일이 살아남습니다.
git clean -fXd-
-x는 그 위험을 알고 씁니다. "완전히 새 상태에서 다시 빌드"가 목적일 때만이고, 그전에.env.local같은 로컬 설정을 백업합니다. -
경로를 좁힙니다. 저장소 전체가 아니라 대상 디렉터리를 지정하면 사고 범위가 줄어듭니다.
git clean -fd apps/dev/.next-
중첩된 Git 저장소는 한 번 더 막혀 있습니다. 문서가 적듯 추적되지 않는 중첩 저장소(
.git하위 디렉터리가 있는 디렉터리)는-f를 두 번 줘야 삭제됩니다 — 이 방어를 뚫어야 할 상황인지 그 자리에서 다시 생각합니다. -
되돌릴 수 없다는 점을 기억합니다. 추적된 적 없는 파일은 Git 어디에도 사본이 없습니다. 커밋되지 않은 작업이 걱정되면
git stash -u로 먼저 담아두는 편이 안전합니다.
댓글0
댓글을 남기려면 로그인이 필요해요. 로그인
아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.