개발하다 보면 “로컬에는 두고 싶지만 Git에서는 빼고 싶다”, “이미 커밋된 민감한 파일을 지우고 싶다” 같은 상황이 생깁니다. 이럴 때 쓰는 명령이 바로 git rm 입니다. 이 글에서는 실무에서 자주 쓰는 패턴만 추려 빠르게 정리합니다.

    git rm 한 줄 정의

    작업 디렉터리(로컬 파일)와 Git 인덱스(스테이징/히스토리)에서 파일을 제거하는 명령.

    • 기본 동작: 로컬 파일도 삭제 + 다음 커밋에 삭제 반영
    • 로컬은 남기고 Git에서만 제거하려면 --cached 사용

     

    Git에서만 제거 (로컬은 유지) — 민감정보에 최적

    # .env를 Git 추적에서만 제거(파일은 로컬에 남김)
    git rm --cached .env
    git commit -m "Remove .env from repository"
    
    # 반드시 .gitignore에 .env를 추가하세요. 그래야 이후부터 다시 추적되지 않습니다.
    echo ".env" >> .gitignore
    git add .gitignore
    git commit -m "Add .env to .gitignore"
    
    # 로컬 파일도 함께 삭제
    git rm .env
    git commit -m "Delete .env completely"
    
    #디렉터리/패턴 한 번에 제거
    # 디렉터리 통째로
    git rm -r path/to/dir
    
    # 특정 확장자 전부
    git rm --cached "*.log"
    
    # 폴더 안 특정 패턴
    git rm --cached -r logs/  # 폴더 통째로 추적 해제
    
    #강제 삭제 (강제 스테이지 제거)
    git rm -f file-that-changed-locally.txt

     

    git rm vs OS의 rm/del 차이

    • OS의 rm으로 파일을 지우면 Git은 변화만 감지합니다. 이후에 git add -A 또는 git commit -a를 해야 커밋에 반영됩니다.
    • git rm은 삭제 + 스테이징까지 한 번에 처리하므로 실수할 여지가 적습니다.

     

    한 번에 자주 쓰는 시나리오(복붙용)

    A) .env가 이미 커밋됨 → 앞으로 추적 금지 + Git에서만 제거

    echo ".env" >> .gitignore
    git add .gitignore
    git commit -m "Add .env to .gitignore"
    
    git rm --cached .env
    git commit -m "Remove .env from repository"
    git push

     

    B) 빌드 산출물 무시하기

    # 예: dist/는 커밋하지 않음
    echo "dist/" >> .gitignore
    git add .gitignore && git commit -m "Ignore dist folder"
    
    # 기존에 올라간 dist 제거(로컬은 유지)
    git rm --cached -r dist/
    git commit -m "Stop tracking dist folder"
    git push

     

    과거 커밋에서 완전히 지우고 싶을 때(히스토리 재작성)

    git rm만으로는 과거 커밋에 남은 기록은 지워지지 않습니다. 민감정보가 노출됐다면 아래처럼 히스토리 재작성이 필요합니다.

    권장: git filter-repo

    # 설치(예: Debian/Ubuntu)
    sudo apt-get install git-filter-repo
    
    # .env 기록 전체 제거
    git filter-repo --path .env --invert-paths
    
    # 강제 푸시
    git push origin --force --all
    git push origin --force --tags

     

     

    728x90
    Posted by 천상나타.