본문 바로가기
기타/Git

[Git] rm

by 코딩하는 랄로 2023. 12. 14.
728x90

git rm

rm은 remove, 즉 파일을 삭제하기 위한 명렁어이다. git rm 명렁어를 사용하면 tracked 상태( Git이 관리하고 있는 상태 )의 파일을 staging area 에서 제거한다. 해당 명렁어를 사용하면 working directory ( 현재 작업 폴더 )에서도 파일이 지워진다.

 

git rm 명렁어를 사용하여 파일 하나를 지워보자.

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ ls
file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git rm file1.txt
rm 'file1.txt'

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ ls

 

git rm 명렁어 이후, working directory 내에서도 파일이 지워진 것을 확인할 수 있다. 만약 다시 되돌리고 싶다면 어떻게 해야 할까?

 

 

 

git rm 복구시키기( before commit )

이에 대해서 알아보기 전에 먼저, git rm 명렁어를 사용하면 staging area에서 제거된다고 하였는데 이 부분을 다시 한번 되짚어보자.

 

일반적으로 우리는 현재 staging area에서 변경된 사항( 파일 수정, 추가 등등 )들을 다시 staging area에 올림으로 git에게 변경된 파일을 알려주고 커밋을 통해 변경 사항을 반영한 새로운 버전의 스냅샷을 기록한다.

 

그렇기 때문에 git rm 명렁어는 단순하게 "파일을 삭제하는 명렁어이다" 에서 끝나는 것이 아닌 이 또한 버전의 변경 사항으로써 인식해야 하는 것이다. staging area에서 해당 파일을 제거한다는 것은 git이 해당 파일을 더 이상 관리하지 않겠다는 의미임과 동시에 현재의 버전에서의 변경 사항이 생겼다는 것을 뜻하는 것이다.

 

그리고 커밋하지 않은 변경사항은 언제든지, 다시 되돌릴 수 있다. ( staged => unstaged 상태로 만들 수 있다. ) 위에서 삭제한 파일을 다시 복구시켜보자!!

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git restore --staged file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    file1.txt

no changes added to commit (use "git add" and/or "git commit -a")

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git restore file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ ls
file1.txt

 

git rm을 사용하면 해당 변경사항이 staged 상태에 있기 때문에 unstaged 상태로 만들어준 후, 그 상태에서 다시 restore를 통해 변경 사항을 다시 되돌려 삭제되었던 파일이 다시 돌아온 것을 볼 수 있다.

 

 

 

git rm 복구시키기( after commit )

만약, 이미 커밋하여 변경 사항을 저장하였는데 해당 파일을 복구 시켜야한다면 어떻게 해야 할까? 이럴 때가, 바로 커밋을 통해 남겨두었던 기록을 사용할 때인 것이다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git rm file1.txt
rm 'file1.txt'

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git commit -m "delete"
[master c8e79d9] delete
 1 file changed, 1 deletion(-)
 delete mode 100644 file1.txt
 
 user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ ls

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git reset HEAD~1
Unstaged changes after reset:
D       file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git restore file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ ls
file1.txt

 

git reset은 이전 버전의 커밋으로 돌아갈 수 있는 명렁어인데, 아무 옵션없이 사용한다면 되돌아간 커밋 이후의 변경 사항을 unstaged 상태로 저장하게 되고 HEAD~1은 지금 버전에서 바로 이전 단계의 버전으로 되돌아가라는 의미이다. ( reset 명렁어에 대해서 추후에 더 자세히 다루겠다. )

 

이를 이용하여 이전 버전의 커밋으로 돌아간 뒤, unstaged 상태에 있는 변경 사항 ( file1.txt가 삭제됨 )을 다시 restore 명렁어를 사용하여 되돌려 주면 파일이 복구가 되어있는 것을 확인할 수 있다.

 

 

 

일반명렁어 rm

만약, git rm이 아닌 rm을 사용하여 working directory에 있는 파일만을 지웠을 경우, git add 또는 git rm 을 다시 사용하여 변경 사항을 staged 상태로 만들 수 있다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ rm file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    file1.txt

no changes added to commit (use "git add" and/or "git commit -a")

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git rm file1.txt
rm 'file1.txt'

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    file1.txt

 

 

 

git rm -f

만약, 파일이 수정되었거나(staged => modified) 이미 staging area에 추가(staged)된 파일을 git rm을 통해 삭제하려고 한다면 어떻게 될까?  

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ echo "modified file" > file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   file1.txt

no changes added to commit (use "git add" and/or "git commit -a")

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git rm file1.txt
error: the following file has local modifications:
    file1.txt
(use --cached to keep the file, or -f to force removal)

 

에러가 발생한다!! git은 modified 된 파일 또는 staging area에 추가된 파일, 즉 변경 사항이 있는 파일을 커밋을 통해 기록하지 않고 삭제되는 것을 막아놓았기 때문이다. ( 실수로 데이터를 삭제하는 상황을 막기 위해서 ) 그렇기 때문에 이러한 상황에서는 -f 옵션을 통해 강제로 삭제해야 한다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git rm -f file1.txt
rm 'file1.txt'

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    file1.txt

 

 

 

git rm --cached

지금까지 살펴본 git rm 명렁어는 staging area 뿐만 아니라 working directory에 있는 파일도 삭제한다. 만약, working directory에 있는 파일을 삭제되기를 원하지 않는다면, git이 해당 파일만을 관리하지 못하게 하고 싶다면 ( tracked => untracked ) --cached 옵션을 사용하면 된다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ ls
file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git rm --cached file1.txt
rm 'file1.txt'

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    file1.txt

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

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ ls
file1.txt

 

 

 

 

reference : pro git

728x90

'기타 > Git' 카테고리의 다른 글

[Git] log  (1) 2023.12.20
[Git] mv  (0) 2023.12.20
[Git] Commit  (2) 2023.12.06
[Git] diff  (0) 2023.12.04
[Git] .gitignore  (2) 2023.11.26