숏컷 코드
# 파일을 작업 트리와 인덱스에서 함께 삭제
git rm old.txt
# 파일은 남기고 Git 추적만 중단
git rm --cached .env
# 디렉터리 단위 삭제
git rm -r legacy/
# 파일 이름 변경을 스테이징
git mv old-name.js new-name.js
# 외부에서 삭제하거나 이름 바꾼 변경을 스테이징
git add -u| 상황 | 적합한 명령 |
|---|---|
| 추적 중인 파일을 저장소에서 삭제 | git rm <file> |
| 로컬 파일은 보존하고 다음 커밋부터 추적 중단 | git rm --cached <file> |
| 추적 중인 디렉터리 삭제 | git rm -r <dir> |
| 이름 변경을 명시적으로 기록 | git mv <old> <new> |
| OS 파일 탐색기에서 이미 삭제·이동함 | git add -u |
추적 상태
git rm은 작업 트리 삭제와 인덱스 반영을 한 번에 처리한다
추적 중인 파일을 파일 탐색기나 rm 명령으로 지우면 작업 트리에서는 사라지지만 인덱스에는 아직 삭제가 반영되지 않습니다. 이 상태에서 git status는 deleted 파일을 보여 주고, 다음 커밋에 넣으려면 삭제 변경을 스테이징해야 합니다. git rm old.txt는 파일 삭제와 삭제 변경 스테이징을 함께 처리합니다.
rm old.txt
git status
git add -u old.txt
# 위 흐름과 비슷한 결과
git rm old.txt파일은 이미 지워졌고 삭제만 스테이징하면 되는 상황에서는 git add -u가 적합합니다. 여러 파일을 외부 도구로 정리한 뒤 한 번에 삭제와 수정만 반영할 때도 git add -u를 쓸 수 있습니다. 단, 새 untracked 파일은 git add -u에 포함되지 않습니다.
--cached는 파일을 지우지 않고 추적 대상에서만 뺀다
git rm --cached <file>은 인덱스에서 파일을 제거하지만 작업 트리의 실제 파일은 남깁니다. 이미 커밋된 .env, 로컬 설정 파일, 생성 산출물을 앞으로는 추적하지 않으려는 경우에 사용합니다. 보통 .gitignore 패턴 추가와 함께 커밋해야 다음부터 다시 추적 대상에 올라오지 않습니다.
git rm --cached .env
echo ".env" >> .gitignore
git add .gitignore
git commit -m "Stop tracking local env file"--cached 없이 git rm .env를 실행하면 로컬 파일도 삭제됩니다. "저장소에서는 빼지만 내 컴퓨터에는 유지"가 목적이면 반드시 --cached를 붙여야 합니다.
git mv는 이동과 스테이징을 묶어 주는 편의 명령이다
Git은 rename을 별도 객체로 저장하지 않고, diff를 계산할 때 삭제와 추가가 충분히 비슷하면 rename으로 감지합니다. 그래서 git mv old new는 내부적으로 파일 이동과 인덱스 갱신을 묶어 주는 편의 명령에 가깝습니다. 파일 탐색기에서 이름을 바꾼 뒤 git add -A 또는 git add -u로 반영해도 최종 diff에서 rename으로 보일 수 있습니다.
git mv src/user.js src/account-user.js
git status
git diff --cached --stat이름 변경과 내용 수정이 한 커밋에 크게 섞이면 Git이 rename을 감지하기 어렵고 리뷰도 어려워집니다. 가능하면 파일 이름 변경 커밋과 큰 내용 수정 커밋을 분리하는 편이 안전합니다.
선택 기준
| 목적 | 선택 |
|---|---|
| 파일을 저장소와 로컬에서 모두 삭제 | git rm <file> |
| 파일은 로컬에 두고 저장소 추적만 중단 | git rm --cached <file> |
| 외부 도구로 이미 삭제한 파일 반영 | git add -u |
| 새 파일 추가까지 함께 반영 | git add -A |
| 이름 변경을 작은 단위로 남김 | git mv <old> <new> |
| rename 인식 확인 | git diff --cached --stat 또는 git status |
git add -A는 수정, 삭제, 새 파일을 모두 스테이징합니다. 반대로 git add -u는 이미 추적 중인 파일의 수정과 삭제만 스테이징하고 새 파일은 포함하지 않습니다. 삭제 정리만 커밋하려는 경우 git add -u가 더 좁은 선택입니다.
주의할 점
git rm은 작업 트리 파일도 삭제합니다. 로컬 파일을 보존해야 하는 설정 파일이나 비밀 정보 파일에는 git rm --cached를 사용하고,
실행 전 git status --short로 대상이 tracked 파일인지 확인하십시오.
실패 예시
- 이미 커밋된 .env를 추적 중단하려고 git rm .env 실행
- 로컬 .env 파일까지 삭제됨
- .gitignore를 함께 추가하지 않아 다시 git add 대상에 나타남
대응
- git rm --cached .env
- .gitignore에 .env 추가
- 별도 커밋으로 추적 중단 의도를 남김대소문자만 바꾸는 rename은 파일 시스템 설정에 따라 Git이 바로 인식하지 못할 수 있습니다. User.js를 user.js로 바꾸는 작업처럼 대소문자만 다른 rename은 중간 이름을 거치거나 git mv를 명시적으로 사용해 상태를 확인하는 편이 안전합니다.
참고 링크
2 sources