본문으로 건너뛰기
개발 머꼬
개발 노트Git
hohyeon.dev21

빌드 산출물을 지우려다 작성 중이던 파일까지 날린 뒤 생긴 습관

  • #Common Pitfall
  • #Engineering Note
  • #Git

문제 발생

브랜치를 옮길 때마다 남는 빌드 산출물을 정리하려고 검색해서 나온 명령을 그대로 실행했습니다.

git clean -fdx

빌드 산출물은 사라졌는데, 아직 커밋하지 않은 새 파일과 로컬 설정(.env.local)도 함께 사라졌습니다. 되돌릴 방법은 없었습니다 — Git이 추적한 적 없는 파일이라 reflog에도 없습니다.

원인 분석

이 명령은 "정리"가 아니라 "삭제"입니다. Git 문서의 정의 그대로 — 현재 디렉터리부터 시작해 버전 관리되지 않는 파일들을 재귀적으로 제거해 작업 트리를 청소합니다.

플래그가 각각 범위를 넓힙니다.

  • -d — 문서 설명대로 기본적으로는 너무 많이 지우지 않기 위해 추적되지 않는 디렉터리로 재귀하지 않으며, -d를 주면 그 디렉터리까지 들어갑니다.
  • -x표준 무시 규칙(.gitignore)을 사용하지 않아, 무시되던 파일까지 전부 지웁니다. .env.local이 여기서 사라졌습니다.
  • -X — 반대로 Git이 무시하는 파일만 지웁니다. 빌드 산출물만 치우고 수동으로 만든 파일은 남기고 싶을 때 쓰는 것이 이쪽입니다.

Git도 안전장치를 두고 있습니다 — clean.requireForce가 false로 설정돼 있지 않으면 -f 없이는 파일이나 디렉터리 삭제를 거부합니다. 우리가 -f로 그 장치를 끈 셈입니다.

해결 방안

  1. 항상 -n으로 먼저 봅니다. 문서 설명대로 아무것도 실제로 제거하지 않고 무엇이 지워질지 보여주며, 이때는 clean.requireForce도 무시됩니다.
git clean -nd
git clean -ndx     # 무시된 파일까지 포함하면 무엇이 사라지는지
  1. 빌드 산출물만 지울 때는 -X입니다. .gitignore에 있는 것만 지우므로 새로 만든 파일이 살아남습니다.
git clean -fXd
  1. -x는 그 위험을 알고 씁니다. "완전히 새 상태에서 다시 빌드"가 목적일 때만이고, 그전에 .env.local 같은 로컬 설정을 백업합니다.

  2. 경로를 좁힙니다. 저장소 전체가 아니라 대상 디렉터리를 지정하면 사고 범위가 줄어듭니다.

git clean -fd apps/dev/.next
  1. 중첩된 Git 저장소는 한 번 더 막혀 있습니다. 문서가 적듯 추적되지 않는 중첩 저장소(.git 하위 디렉터리가 있는 디렉터리)는 -f를 두 번 줘야 삭제됩니다 — 이 방어를 뚫어야 할 상황인지 그 자리에서 다시 생각합니다.

  2. 되돌릴 수 없다는 점을 기억합니다. 추적된 적 없는 파일은 Git 어디에도 사본이 없습니다. 커밋되지 않은 작업이 걱정되면 git stash -u로 먼저 담아두는 편이 안전합니다.

공식 문서

마지막 수정

좋아요북마크

댓글0

아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.