.gitignore에 넣었는데 추적 파일이 계속 보이는 이유
by 그릿 | GROWTH_ESSAY | 2026-10-23
#practical-guides #Git #개발git diff --cached는 커밋할 인덱스와 HEAD의 차이를 보여줍니다. git diff HEAD는 작업트리와 HEAD 사이의 전체 차이를 보여주고, git status --short는 인덱스와 작업트리의 상태를 함께 표시합니다.
왜 .gitignore가 이미 추적 중인 파일에 적용되지 않나요
.gitignore의 목적은 Git이 아직 추적하지 않은 파일을 계속 추적 대상에 넣지 않도록 하는 데 있습니다. 한 번 커밋된 note.txt처럼 이미 인덱스와 커밋에 들어간 파일은 이름을 패턴에 추가해도 계속 추적됩니다. 그래서 파일 내용이 바뀌면 git status --short에 M note.txt가 표시됩니다.
여기서 상태의 첫째 칸은 인덱스 상태이고, 둘째 칸은 작업트리 상태입니다. 예를 들어 M note.txt는 인덱스에는 아직 반영되지 않은 변경이 작업트리에 있다는 뜻입니다. M 처럼 첫째 칸에 표시되면 인덱스에 추가된 변경이 커밋 대기 중이라는 뜻입니다. 두 칸을 구분하면 현재 파일이 커밋 준비 단계에 있는지, 작업트리에만 수정이 남아 있는지 알 수 있습니다.
추적을 멈추고 파일은 남겨두는 방법
입력의 재현처럼 .gitignore에 note.txt를 적은 뒤 파일을 계속 보관하려면 git rm --cached note.txt를 실행합니다. 이 명령은 작업트리의 파일을 삭제하지 않고 인덱스에서만 제거합니다. 실행 뒤 test -f note.txt && cat note.txt로 파일이 남아 있고 내용이 after인지 확인할 수 있습니다.
그 다음 git status --short에는 D note.txt와 ?? .gitignore가 표시됩니다. 첫째 줄의 첫째 칸 D는 인덱스에서 파일 삭제가 커밋 대기 중이라는 표시이며, 작업트리의 파일은 그대로 존재합니다. .gitignore가 ??로 보이는 이유는 새 파일이고 아직 인덱스에 추가되지 않았기 때문입니다. 이 상태에서 이후 커밋을 진행하면 Git은 note.txt의 추적을 멈추고, 같은 이름의 파일이 다시 추가되는 상황도 .gitignore 패턴으로 막습니다.
변경 위치를 명령별로 확인하기
커밋할 내용을 확인할 때는 git diff --cached를 사용합니다. 이 명령은 인덱스와 HEAD를 비교하므로, 인덱스에 들어간 변경만 보여줍니다. 작업트리에 아직 남아 있는 수정까지 HEAD와 비교하려면 git diff HEAD를 사용합니다. 두 명령은 비교 대상과 확인 목적이 다릅니다.
git add 뒤 일반 git diff가 비어 있으면, 현재 작업트리와 인덱스가 같다는 뜻일 수 있습니다. 이 상태에서 git diff --cached를 확인하면 인덱스와 HEAD 사이의 커밋 대기 변경을 볼 수 있습니다. cached 결과가 비었다고 항상 수정이 없다고 단정할 수는 없습니다. 아직 인덱스에 들어가지 않은 작업트리 수정이나 추적되지 않은 파일이 있을 수 있으므로 git status --short를 함께 확인하세요. git add 뒤 파일을 다시 수정하면 인덱스와 작업트리가 달라져 일반 git diff에 새 수정이 다시 표시됩니다.
적용 조건과 다음 확인
파일을 이미 추적 중인지 먼저 git status --short와 각 diff 명령으로 확인합니다. 추적을 멈출 파일이면 git rm --cached note.txt를 적용하고, 파일 보존 여부는 test -f note.txt && cat note.txt로 확인합니다. 마지막으로 git status --short에서 인덱스 상태와 작업트리 상태를 각각 읽으면 .gitignore 적용 준비와 남은 커밋 대기 내용을 한 번에 확인할 수 있습니다.
새 폴더에서 직접 확인하기
새 예제 폴더에서 실행하세요. 기존 프로젝트에서 초기화 명령을 실행하지 않습니다.
mkdir git-diff-example
cd git-diff-example
git init -q
printf 'before\n' > note.txt
git add note.txt
git -c user.name=Example -c user.email=example@example.invalid -c commit.gpgsign=false commit -qm initial
printf 'note.txt\n' > .gitignore
printf 'after\n' > note.txt
git status --short
git rm --cached note.txt
test -f note.txt && cat note.txt
git status --short실제로 확인한 출력
git status --short
M note.txt
?? .gitignore
test -f note.txt && cat note.txt
after
git status --short
D note.txt
?? .gitignore
예제 확인: git version 2.50.1 (Apple Git-155), 2026-10-23
Git 공식 문서에서 명령의 비교 범위를 확인할 수 있어요.