git rm --cached 사용법: Git 인덱스에서 파일 제거 방법

GitBeginner
지금 연습하기

소개

Git 은 개발자가 코드베이스를 효과적으로 관리하는 데 도움이 되는 강력한 버전 관리 시스템입니다. Git 에서 흔히 사용되는 작업 중 하나는 변경 사항의 스테이징 영역인 인덱스에서 파일을 제거하는 것입니다. 이 튜토리얼에서는 로컬 파일 시스템에서 파일을 삭제하지 않고 Git 인덱스에서 파일을 제거하기 위해 git rm --cached 명령을 사용하는 방법을 살펴보겠습니다.

실용적인 예시를 통한 Git 인덱스 이해

Git 인덱스는 스테이징 영역 (staging area) 이라고도 하며, Git 버전 관리 시스템에서 중요한 구성 요소입니다. 이는 작업 디렉토리와 Git 저장소 사이의 중간 저장 영역 역할을 합니다. 파일을 변경할 때 Git 은 해당 변경 사항을 자동으로 커밋하지 않습니다. 대신, 커밋하기 전에 변경 사항을 명시적으로 인덱스에 추가해야 합니다.

Git 인덱스가 어떻게 작동하는지 이해하기 위해 간단한 예시를 만들어 보겠습니다.

  1. 먼저, 프로젝트를 위한 새 디렉토리를 만들고 Git 저장소를 초기화해 보겠습니다.
mkdir git-index-demo
cd git-index-demo
git init

다음과 유사한 출력을 볼 수 있습니다.

Initialized empty Git repository in /home/labex/project/git-index-demo/.git/
  1. 이제 간단한 텍스트 파일을 만들어 보겠습니다.
echo "Hello, Git!" > hello.txt
  1. 저장소의 상태를 확인합니다.
git status

hello.txt가 추적되지 않음 (untracked) 을 나타내는 출력을 볼 수 있습니다.

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        hello.txt

nothing added to commit but untracked files present (use "git add" to track)
  1. 파일을 Git 인덱스에 추가합니다.
git add hello.txt
  1. 다시 상태를 확인합니다.
git status

이제 파일이 커밋을 위해 스테이징 (staged) 된 것을 볼 수 있습니다.

On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   hello.txt

축하합니다! 방금 파일을 Git 인덱스에 추가했습니다. Git 이 git rm --cached <file>을 사용하여 파일을 스테이징 해제 (unstage) 할 수 있다고 알려주는 것을 확인하세요. 이는 다음 단계에서 배울 내용입니다.

Git 인덱스는 다음과 같은 몇 가지 이점을 제공합니다.

  • 다음 커밋에 포함할 변경 사항을 선택적으로 선택할 수 있습니다.
  • 파일의 특정 부분을 스테이징할 수 있습니다.
  • 다음 커밋에 포함될 내용을 미리 볼 수 있습니다.

다음 단계에서는 git rm --cached 명령을 사용하여 Git 인덱스에서 파일을 제거하는 방법을 배우겠습니다.

git rm --cached 를 사용하여 인덱스에서 파일 제거하기

이제 Git 인덱스에 파일이 있으므로 git rm --cached 명령을 사용하여 파일을 제거하는 방법을 배우겠습니다. 이 명령은 로컬 파일 시스템에서 파일을 삭제하지 않고 Git 인덱스 (스테이징 영역) 에서 파일을 제거합니다.

이전 단계의 예시를 계속 진행해 보겠습니다.

  1. git-index-demo 디렉토리에 아직 있는지 확인합니다.
cd ~/project/git-index-demo
  1. 저장소의 현재 상태를 확인해 보겠습니다.
git status

hello.txt가 커밋을 위해 스테이징 (인덱스에 있음) 된 것을 볼 수 있습니다.

On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   hello.txt
  1. 이제 git rm --cached 명령을 사용하여 Git 인덱스에서 파일을 제거해 보겠습니다.
git rm --cached hello.txt

다음과 유사한 출력을 볼 수 있습니다.

rm 'hello.txt'
  1. 다시 상태를 확인합니다.
git status

이제 파일이 추적되지 않음 (untracked) 을 알 수 있습니다.

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        hello.txt

nothing added to commit but untracked files present (use "git add" to track)
  1. 파일이 로컬 파일 시스템에 여전히 존재하는지 확인합니다.
ls -l

출력에서 hello.txt를 볼 수 있습니다.

total 4
-rw-r--r-- 1 labex labex 11 [date] hello.txt

이는 git rm --cached가 Git 인덱스에서만 파일을 제거하고 로컬 파일 시스템에서는 제거하지 않았음을 확인합니다.

  1. 인덱스에서 여러 파일을 제거하는 방법을 이해하기 위해 다른 파일을 만들어 보겠습니다.
echo "Another file" > another.txt
git add another.txt
  1. 상태를 확인합니다.
git status

다음과 같은 출력을 볼 수 있습니다.

On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   another.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        hello.txt
  1. 이제 hello.txt를 다시 인덱스에 추가하고 여러 파일을 제거하는 방법을 살펴보겠습니다.
git add hello.txt
git status

두 파일 모두 인덱스에 있는 것을 볼 수 있습니다.

On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   another.txt
        new file:   hello.txt
  1. 두 파일을 한 번에 인덱스에서 제거하려면:
git rm --cached hello.txt another.txt
  1. 다시 한 번 상태를 확인합니다.
git status

이제 두 파일 모두 추적되지 않아야 합니다.

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        another.txt
        hello.txt

nothing added to commit but untracked files present (use "git add" to track)

git rm --cached 명령은 특히 다음과 같은 경우에 유용합니다.

  • 실수로 파일을 Git 인덱스에 추가한 경우
  • 시스템에서 파일을 삭제하지 않고 파일 추적을 중지하려는 경우
  • 파일 패턴을 .gitignore에 추가하려는 경우, 먼저 인덱스에서 기존 파일을 제거해야 합니다.

다음 단계에서는 이 명령의 몇 가지 실용적인 사용 사례를 살펴보겠습니다.

.gitignore 를 사용한 실용적인 사용 사례

git rm --cached의 가장 일반적인 사용 사례 중 하나는 무시해야 하는 파일의 추적을 중지하려는 경우입니다. 실용적인 예시를 통해 이를 살펴보겠습니다.

파일 생성 및 커밋

먼저, 실수로 무시해야 하는 파일을 커밋한 상황을 만들어 보겠습니다.

  1. git-index-demo 디렉토리에 아직 있는지 확인합니다.
cd ~/project/git-index-demo
  1. 기존 파일을 인덱스에 추가해 보겠습니다.
git add hello.txt another.txt
  1. 이제 이러한 파일을 커밋해 보겠습니다.
git commit -m "Initial commit"

커밋을 확인하는 출력을 볼 수 있습니다.

[master (root-commit) xxxxxxx] Initial commit
 2 files changed, 2 insertions(+)
 create mode 100644 another.txt
 create mode 100644 hello.txt
  1. 추적하지 않으려는 생성된 파일을 시뮬레이션하는 로그 파일을 만듭니다.
echo "Some log data" > application.log
  1. 실수로 이 로그 파일을 추가하고 커밋해 보겠습니다.
git add application.log
git commit -m "Add log file by mistake"

커밋을 확인하는 출력을 볼 수 있습니다.

[master xxxxxxx] Add log file by mistake
 1 file changed, 1 insertion(+)
 create mode 100644 application.log

.gitignore 및 git rm --cached 사용

이제 .gitignore 파일을 만들고 git rm --cached를 사용하여 실수를 수정해 보겠습니다.

  1. 모든 .log 파일을 무시하도록 지정하는 .gitignore 파일을 만듭니다.
echo "*.log" > .gitignore
  1. 상태를 확인합니다.
git status

다음과 같은 출력을 볼 수 있습니다.

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore

nothing added to commit but untracked files present (use "git add" to track)

.gitignore 파일에 *.log 패턴이 있음에도 불구하고 application.log 파일이 수정된 것으로 나열되지 않는 것을 확인하세요. 이는 .gitignore가 추적되지 않은 파일이 인덱스에 추가되는 것을 방지하기 때문입니다. 이미 추적된 파일은 계속 추적됩니다.

  1. .gitignore 파일을 추가하고 커밋해 보겠습니다.
git add .gitignore
git commit -m "Add .gitignore file"
  1. 이제 파일 시스템에 유지하면서 Git 인덱스에서 로그 파일을 제거해 보겠습니다.
git rm --cached application.log

다음과 같은 출력을 볼 수 있습니다.

rm 'application.log'
  1. 상태를 확인합니다.
git status

다음과 같은 출력을 볼 수 있습니다.

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    application.log

이는 Git 의 추적 시스템에서 파일 삭제가 다음 커밋에 포함될 것임을 나타냅니다.

  1. 이 변경 사항을 커밋해 보겠습니다.
git commit -m "Stop tracking application.log"
  1. 다시 한 번 상태를 확인합니다.
git status

다음과 같은 출력을 볼 수 있습니다.

On branch master
nothing to commit, working tree clean
  1. 이제 파일이 파일 시스템에 여전히 존재하는지 확인해 보겠습니다.
ls -l

application.log가 다른 파일과 함께 여전히 존재하는 것을 볼 수 있습니다.

total 16
-rw-r--r-- 1 labex labex 13 [date] another.txt
-rw-r--r-- 1 labex labex 13 [date] application.log
-rw-r--r-- 1 labex labex 6  [date] .gitignore
-rw-r--r-- 1 labex labex 11 [date] hello.txt
  1. Git 이 변경 사항을 추적하는지 확인하기 위해 로그 파일을 수정해 보겠습니다.
echo "More log data" >> application.log
git status

다음과 같은 출력을 볼 수 있습니다.

On branch master
nothing to commit, working tree clean

로그 파일을 수정했지만, .gitignore 패턴으로 인해 파일이 이제 무시되므로 Git 은 변경 사항을 감지하지 않습니다.

이는 다음과 같이 무시해야 하는 파일을 실수로 커밋하는 경우 매우 일반적인 워크플로우입니다.

  • 빌드 아티팩트
  • 로그 파일
  • 민감한 정보가 포함된 구성 파일
  • 종속성 디렉토리 (예: JavaScript 프로젝트의 node_modules)

.gitignore와 함께 git rm --cached를 사용하면 다음을 수행할 수 있습니다.

  1. 무시해야 하는 파일의 추적을 중지합니다.
  2. 파일을 로컬 파일 시스템에 유지합니다.
  3. 향후 저장소에 추가되는 것을 방지합니다.

고급 예제: 민감한 정보 제거

git rm --cached의 또 다른 중요한 사용 사례는 저장소 기록에서 민감한 정보를 제거하는 것입니다. Git 은 변경 사항을 추적하도록 설계되었지만, 때로는 비밀번호, API 키 또는 기타 민감한 데이터가 포함된 파일을 실수로 커밋할 수 있습니다.

이 상황을 어떻게 처리하는지 살펴보겠습니다.

  1. git-index-demo 디렉토리에 있는지 확인합니다.
cd ~/project/git-index-demo
  1. 민감한 정보가 포함된 구성 파일처럼 시뮬레이션하는 파일을 생성합니다.
echo "API_KEY=1234567890abcdef" > config.properties
echo "DATABASE_PASSWORD=supersecretpassword" >> config.properties
  1. 이 파일을 추가하고 커밋합니다.
git add config.properties
git commit -m "Add configuration file"
  1. 이제 민감한 정보를 커밋했음을 깨닫고 로컬 복사본을 유지하면서 추적에서 제거하고 싶다고 가정해 보겠습니다.
git rm --cached config.properties
  1. 실제 민감한 정보가 포함되지 않은 템플릿 파일을 생성합니다.
echo "API_KEY=your_api_key_here" > config.properties.template
echo "DATABASE_PASSWORD=your_password_here" >> config.properties.template
  1. 템플릿 파일을 Git 에 추가합니다.
git add config.properties.template
  1. 실제 구성 파일은 무시하고 템플릿은 추적하도록 .gitignore 파일을 업데이트합니다.
echo "config.properties" >> .gitignore
  1. 업데이트된 .gitignore 파일을 추가하고 이러한 변경 사항을 커밋합니다.
git add .gitignore
git commit -m "Remove sensitive config from tracking, add template instead"
  1. 저장소 상태를 확인해 보겠습니다.
git status

다음과 같이 표시되어야 합니다.

On branch master
nothing to commit, working tree clean
  1. 파일 시스템에 두 파일이 모두 존재하는지 확인합니다.
ls -l config*

다음과 같이 표시되어야 합니다.

-rw-r--r-- 1 labex labex 60 [date] config.properties
-rw-r--r-- 1 labex labex 60 [date] config.properties.template
  1. 어떤 파일이 추적되고 있는지 확인합니다.
git ls-files | grep config

다음만 표시되어야 합니다.

config.properties.template

이 패턴은 프로젝트에서 일반적으로 다음과 같은 용도로 사용됩니다.

  • 민감한 구성을 버전 관리에서 제외
  • 다른 기여자가 자체 구성 파일을 만들 수 있도록 템플릿 제공
  • 민감한 정보의 우발적인 커밋 방지

git rm --cached는 향후 커밋에서 파일을 제거하지만 Git 기록에서 파일을 제거하지는 않는다는 점을 기억하십시오. 이미 원격 저장소로 민감한 정보를 푸시했다면 기록에서 완전히 제거하기 위해 추가 조치를 취해야 할 수 있습니다.

실제 프로젝트 시나리오에서는 다음을 고려할 수 있습니다.

  • 유출된 자격 증명을 즉시 순환
  • 민감한 정보에 대해 구성 파일 대신 환경 변수 사용
  • 프로덕션 환경을 위한 전용 비밀 관리 솔루션 사용

이것으로 git rm --cached 명령의 실용적인 사용 사례에 대한 탐색을 마칩니다!

요약

이 튜토리얼에서는 로컬 파일 시스템에서 파일을 삭제하지 않고 Git 인덱스에서 git rm --cached 명령을 사용하여 파일을 제거하는 방법을 배웠습니다. 다음은 다룬 내용입니다.

  • Git 인덱스 (스테이징 영역) 와 Git 워크플로우에서의 역할 이해
  • git rm --cached를 사용하여 인덱스에서 개별 및 여러 파일을 제거하는 방법
  • .gitignoregit rm --cached를 통합하여 무시해야 하는 파일의 추적을 중지하는 방법
  • 실수로 커밋된 파일 제거 및 민감한 정보 처리와 같은 실용적인 시나리오에 이러한 개념 적용

이러한 기술은 깨끗한 Git 저장소를 유지하고 버전 관리 기록에 커밋되는 내용을 적절하게 관리하는 데 필수적입니다. git rm --cached를 활용하여 로컬 작업 디렉토리를 그대로 유지하면서 Git 에서 추적하는 파일을 더 잘 제어할 수 있습니다.