git rm에서 --cached 옵션을 붙이는 경우가 왕왕 있습니다. .gitignore에서 뭔가 추가할 때 많이들 쓴다고 하던데요. 무엇을 하는 명령어일까요? 간단하게 알아보겠습니다.

 


먼저, git status를 보겠습니다. .env가 새로 추가되었고, 2.txt가 수정되었다고 합니다.

 

 이 상태에서 .gitignore 파일을 새로 만들겠습니다. 이 파일에 .env를 추가한 다음에 git add .을 해 보겠습니다.

 

 다시 git status를 보니, .env가 그대로 변경 내역에 있습니다. 왜 그럴까요? 캐시 상태를 보겠습니다.

 

 git ls-files -c를 입력해 보겠습니다. 캐시된 파일들을 보여주는 것입니다. 보니까, .env, .gitignore, 1.txt, 2.txt, README.md가 있음을 알 수 있습니다. gitignore는 track 되지 않는 것을 전제로 합니다. 그런데 이미, 변경 내역에 .env가 track이 되고 있습니다. 이것은 ls-files 명령에 -t 옵션을 주면 확인할 수 있습니다.

 

 

 따라서, git rm .env --cached를 입력해야 합니다.

 


 이제 어떻게 변했는가? 한 번 보도록 하겠습니다.

 

 -t 옵션을 줘서 확인해 보니, 아까와는 다르게 .env가 track 되지 않음을 확인할 수 있어요. -t --others는 tracking 되지 않는 파일들을 보는 것입니다. -t --others를 치니, ? .env가 나옴을 확인할 수 있었습니다. 이는 .env가 변경 사항에 추적되지 않음을 의미합니다. 그리고, 이 파일이 unstaged 상태로 바뀝니다. 그리고 더 중요한 것은 인덱스에서만 이 파일을 제거합니다. 파일 시스템에서 제거하지 않습니다.

 

 조심해야 할 점은, git rm .env -f 명령어는 파일 시스템에서 .env를 제거한다는 것입니다. 조심해서 쓰는 게 좋겠습니다.

 


 그러면, 하나 궁금한 부분. git restore 2.txt --staged랑 git rm 2.txt --cached는 같은 명령어일까요? 비슷해 보이지만 사실 같은 명령어는 아닙니다. 2.txt가 변경 상태에 있다고 해 보겠습니다. 즉, 최신 커밋과 비교했을 때 2.txt가 변경사항이 있었다 해 보겠습니다.

 

 먼저, git resotre --staged 2.txt를 입력해 보겠습니다. 그 후에 git status를 보면 modified 2.txt라고 되어 있습니다. 이는, 변경사항만 버렸다는 것을 의미합니다. 아직 tracking은 되고 있습니다.

 

 

 반면에, git rm 2.txt --cached를 입력해 보겠습니다. 그 다음에 git status를 보면 Untracked files라고 되어 있는 부분에 2.txt가 있습니다. 이는 깃에서 2.txt의 변경 사항을 추적하지 않는다는 의미입니다.