파일 내용을 지우지 않고 git add 취소하기
by 그릿 | GROWTH_ESSAY | 2026-10-20
#practical-guides #Git #개발git add 뒤 변경이 사라진 것처럼 보일 때는 비교 대상과 저장 위치를 나눠서 확인하면 됩니다.
git diff --cached
git diff HEAD
git status --short커밋할 변경은 git diff --cached로 확인하고, 작업트리와 현재 커밋을 합친 전체 변경은 git diff HEAD로 확인합니다. 파일을 스테이징 영역에서 내리면서 내용은 유지하려면 다음 명령을 사용합니다.
git restore --staged note.txt왜 이렇게 보이나요
Git은 파일 내용을 작업트리와 인덱스에 나눠 기록합니다. git add note.txt를 실행하면 현재 파일 내용이 인덱스에 담깁니다. 이후 일반 git diff는 작업트리와 인덱스를 비교하므로 두 내용이 같을 때 출력이 비어 있습니다.
예제에서는 커밋 뒤 note.txt를 before에서 after로 바꾸고 먼저 git diff를 실행했습니다. 이때 작업트리와 인덱스 사이의 변경이 보입니다. 다시 git add note.txt를 실행한 뒤에는 변경이 인덱스에 반영되어 일반 git diff가 비어 있습니다.
이 시점의 변경은 git diff --cached에서 확인됩니다. 이 명령은 인덱스와 HEAD를 비교하므로 커밋 대상으로 준비한 내용을 보여 줍니다. git diff HEAD는 작업트리와 HEAD를 비교하므로 인덱스에 들어간 변경과 아직 작업트리에만 남은 변경을 함께 확인할 때 사용합니다.
어떤 명령으로 확인하나요
스테이징을 취소할 파일을 지정해 다음을 실행합니다.
git restore --staged note.txt--staged는 복원 위치를 인덱스로 지정합니다. Git 공식 문서의 동작처럼 이 경우 기본 복원 기준은 HEAD이며, 작업트리 파일 자체에는 명령이 적용되지 않습니다. 예제에서 명령을 실행한 뒤 git diff --cached는 비어 있고, cat note.txt의 내용은 계속 after로 남습니다.
이제 git status --short를 보면 M note.txt가 표시됩니다. 상태 문자열의 첫째 칸은 인덱스 상태이고 둘째 칸은 작업트리 상태입니다. 따라서 첫째 칸이 비어 있고 둘째 칸에 M이 있으면 파일 내용은 작업트리에 수정된 상태이며 인덱스에는 준비된 변경이 없습니다.
적용 조건과 다음 확인
파일 내용을 남긴 채 스테이징만 취소하려는 경우에 이 명령을 적용합니다. 여러 파일을 대상으로 할 때는 실제로 내릴 경로를 명령 뒤에 지정하고, 예제처럼 특정 파일 하나만 다룰 때는 note.txt를 그대로 사용합니다.
스테이징을 취소한 뒤에는 git diff로 작업트리와 인덱스 사이의 수정 내용을 확인하고, git status --short로 인덱스와 작업트리의 상태를 함께 살핍니다. 다시 파일을 수정하면 일반 git diff에 새로 작업한 부분이 나타납니다. 다시 git add note.txt를 실행하면 그 시점의 내용이 인덱스에 담기고, 일반 diff와 cached diff의 역할도 다시 나뉩니다.
git diff --cached가 비어 있는 결과만으로 저장소에 수정이 전혀 없다고 판단하지는 마세요. 작업트리에만 있는 수정이나 아직 추적되지 않은 파일은 git status --short에서 확인할 수 있습니다. 이 세 명령을 함께 사용하면 커밋 준비 내용, 전체 비교, 파일 상태를 각각 확인할 수 있습니다.
새 폴더에서 직접 확인하기
새 예제 폴더에서 실행하세요. 기존 프로젝트에서 초기화 명령을 실행하지 않습니다.
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 'after\n' > note.txt
git diff
git add note.txt
git diff
git diff --cached
git diff HEAD
git status --short
git restore --staged note.txt
git diff --cached
cat note.txt
git status --short실제로 확인한 출력
git diff
diff --git a/note.txt b/note.txt
index 90be1f3..294186e 100644
--- a/note.txt
+++ b/note.txt
@@ -1 +1 @@
-before
+after
git diff
(출력 없음)git diff --cached
diff --git a/note.txt b/note.txt
index 90be1f3..294186e 100644
--- a/note.txt
+++ b/note.txt
@@ -1 +1 @@
-before
+after
git diff HEAD
diff --git a/note.txt b/note.txt
index 90be1f3..294186e 100644
--- a/note.txt
+++ b/note.txt
@@ -1 +1 @@
-before
+after
git status --short
M note.txt
git diff --cached
(출력 없음)cat note.txt
after
git status --short
M note.txt
예제 확인: git version 2.50.1 (Apple Git-155), 2026-10-20
Git 공식 문서에서 명령의 비교 범위를 확인할 수 있어요.