💡Git 명령어를 사용할 때 비슷해 보여도 동작 방식에 차이가 있는 경우가 많다.
오늘은 git add / git restore, git rm --cached의 차이를 정리했다.
🔎git add . vs git add *
| 명령어 | 의미 | 하위 폴더 | 숨김 파일 |
| git add . | 현재 디렉터리와 하위 모든 파일 추가 | ✅ 포함 | ✅ 포함 |
| git add * | 현재 디렉터리의 보이는 파일만 추가 | ❌ 미포함 | ❌ 미포함 |
📒정리
- git add . : 대부분의 경우 더 안전하고 확실하다.
- git add * : 셸에 따라 확장 방식이 달라서 예상과 다르게 동작할 수 있다.
- ex) *.log를 무시하도록 설정했어도 git add *는 셸 확장 후 적용되므로 무시되지 않을 수 있다.
- 예외 케이스
- git add *도 */* 패턴으로 사용하면 하위 폴더의 보이는 파일을 추가할 수 있지만, 이 역시 셸 의존적이다.
- 숨김 파일은 명시적으로 git add .[^.]* 같은 패턴으로 추가해야 한다.
🔎rm --cached vs restore
rm --cached는 커밋된 것 중에서 추적 피하고 싶은 파일이 있을 때 사용하는 것!
그럼 그 추적 피하고 싶은 파일은 어느 영역에 있는 것인가...staging?
한 번 정리해보자!
| git rm --cached
- 조건: 반드시 Repository에 커밋된 기록이 있는 파일
- 동작:
- Staging Area에서 파일 제거 (Untracked 상태로 변경)
- Working Directory의 파일은 그대로 유지
- 다음 커밋 시 Repository에서 해당 파일 삭제 기록 생성
- 사용 예: .gitignore에 추가해야 할 파일을 실수로 커밋한 경우
| git restore --staged
- 조건: Staging Area에 추가된 변경사항이 있을 때
- 동작:
- Staging Area의 변경사항만 취소 (이전 커밋 상태로 되돌림)
- Working Directory의 수정 내용은 보존
- 사용 예: git add 후 변경사항을 다시 수정해야 할 때
| 파일 추적 상태 흐름
(파일 수정) → Working Directory → (Git이 추적하길 바라는 파일) → Staging Area → (Commit) → Repository
- rm --cached는 화살표를 역으로 가는 것이 아니라, Staging Area에서 Repository로의 연결을 끊는 행위인 것이다.
- 수정된 파일 취소는 git restore <file>로 Working Directory → Staging Area 방향으로 진행됩니다.
📒정리
git rm --cached <file> # Repository에 기록된 파일을 추적 중단 (Staging Area에서 삭제)
git restore --staged <file> # Staging Area의 변경사항 취소 (Working Directory 보존)
git restore <file> # Working Directory의 변경사항 취소 (이전 커밋 상태로 복원)
🔎 git restore . 은 되는데 git rm --cached . 은 왜 안될까?
🔹 git restore .
- 수정 사항을 마지막 커밋 상태로 되돌림
- .는 현재 디렉터리이므로, 하위 폴더까지 재귀적으로 작동 (Git이 내부적으로 -r 옵션을 기본 적용하기 때문)
≫ 잘 작동 됨.
🔹 git rm --cached .
- Git 추적 대상에서만 파일을 제거 (--cached / 로컬 파일은 유지)
- 하지만 .은 디렉터리이고, 실수로 디렉터리 전체를 삭제하는 것을 방지하기 위해 Git은 재귀 옵션(-r) 없이는 삭제를 거부
≫ 에러 발생!
fatal: not removing '.' recursively without -r
✅ 해결 방법
git rm --cached -r .
- -r 옵션을 붙이면 하위 폴더까지 재귀적으로 제거 가능 (추적 중인 모든 파일 제거)
- 주로 .gitignore에 추가된 파일을 Git 추적에서 제거할 때 사용
🧠 기억할 것
- git add . 은 하위 폴더 포함 전체 파일 추가 / git add * 은 현재 폴더 파일만 추가
- git rm --cached는 기본적으로 "이 파일을 앞으로는 버전 관리하지 않겠다"는 선언인 반면, restore 계열 명령은 "내가 한 변경을 취소하겠다"는 개념으로 이해하면 될 것 같다!
- git restore . 은 변경사항 완전히 되돌리기!
- git rm --cached 로 디렉터리 전체의 Git 추적을 끊을 때는 -r 옵션 필요!
'멋쟁이사자처럼 > Git | Github' 카테고리의 다른 글
| [멋사 프론트엔드 부트캠프 14기] Git 작업할 때, 주의해야 할 것은?? (0) | 2025.05.13 |
|---|---|
| [멋사 프론트엔드 부트캠프 14기] .gitignore (0) | 2025.04.24 |
| [멋사 프론트엔드 부트캠프 14기] Git과 Github (2) | 2025.04.24 |
