Git 파일 삭제하기
Git에서 파일을 삭제하고자 하는 경우 git rm 명령을 통해 Tracked 상태의 파일을 제거하여 Untraced 상태로 만들고 제거했다는 내역 자체를 커밋해야 합니다. 말이 복잡하므로 바로 실습으로 들어가 보겠습니다.



다음의 myFile은 저장소에 커밋되어 있는 파일이며, 삭제하기 위해 git rm 명령을 실행했습니다.
$ git rm myFile
rm 'myFile'



myFile이 삭제되었다는 내역이 Staging Area에 추가 되었습니다.
이것은 마치 워킹 디렉터리에서 파일을 수정한 후 git add 명령을 실행해서 변경 내역이 Staging Area에 추가된 것과 같습니다. rm 명령을 실행하면 워킹 디렉터리의 해당 파일을 삭제 후에 파일이 삭제 되었다는 내역을 Staging Area에 추가하는 것입니다. 이때의 myFile은 deleted 상태이면서 Staged 상태입니다.
$ git status
On branch master
Changes to be committed:
        deleted:    myFile



그러나 이때까지 저장소의 master 브랜치에는 해당 파일이 존재하는 것으로 되어 있으므로 git commit 명령을 실행해야 합니다. 이후 파일 삭제 내역이 커밋되면 더이상 Git은 해당 파일을 추적하지 않습니다.
$ git commit -am 'myFile 삭제!!'
[master c575a10] myFile 삭제!!
 1 file changed, 2 deletions(-)
 delete mode 100644 myFile




리눅스 명령어인 rm 명령으로 파일을 삭제해버린 경우
만약 git rm 명령이 아닌 운영체제 레벨의 기본 삭제 명령어인 rm 명령을 통해 파일을 삭제했다고 해도 이후 절차는 같습니다. git rm은 rm 명령 이후 git add 를 실행한 것과 같습니다.

따라서 rm으로 파일을 삭제한 후 다시 한번 git rm 명령을 수행하고 커밋하면 됩니다.
$ rm myFile

$ git rm myFile
rm 'myFile'

$ git commit -am 'myFile 삭제!!'




rm으로 파일 삭제 이후 git rm 또는 git add의 차이
rm 이후 git add 명령을 통해 삭제 내역을 Staging Area에 등록해도 오류가 발생하지 않는데, 이는 add와 rm의 의도를 헷갈리지 않고 사용하기 위해 git rm 명령어를 따로 둔 것이 아닌가 생각됩니다.





수정한 파일 또는 Staged 상태인 파일을 삭제하는 경우
만약 워킹디렉터리에서 파일을 수정한 직후 커밋하기 전에 수정하는 경우 다음의 두 에러를 보게 됩니다.
이때에는 -f 옵션을 추가하여 git rm -f 명령을 통해 강제로 삭제해 주어야 합니다.

워킹 디렉터리에서 파일 수정 직후 삭제하려는 경우 오류 내용
$ git rm testFile
error: the following file has local modifications:
    testFile


워킹 디렉터리에서 파일 수정 후 git add 하고 커밋 직전에 삭제하려는 경우 오류 내용
$ git rm testFile
error: the following file has changes staged in the index:
    testFile


원인은 변경 내역을 커밋하기 전에 삭제하려 했기 때문인데, Git은 안전장치로 실수로 인해 데이터를 삭제하지 못하도록 해 두었기 때문입니다.
따라서 이때에는 위에서 말했듯이 git rm -f 명령을 통해 파일을 삭제해야 합니다.




Git 저장소에서만 삭제하고 실제 파일은 남겨두고 싶은 경우
만약 실제 물리적으로 디스크에는 파일을 남겨두고 Git 저장소에서만 파일을 삭제하고 싶은 경우에는 --cached 옵션을 사용하여 삭제합니다.
이후 마찬가지로 git commit을 통해 삭제 내역을 커밋해 줘야 합니다.
$ git rm --cached testFile
rm 'testFile'



이때 testFile의 상태를 보면 하나는 deleted 이면서 Staged 상태인 testFile 이 존재하고, 또 하나는 Untracked(추적되지 않은) 상태인 testFile이 존재합니다. 이는 Git이 관리중이던 testFile이 --cached 옵션을 통해 삭제되면서 파일이 삭제되었다는 내역이 Staging Area에 추가됨과 동시에 원본 파일이 디스크에만 남게되고 추적에서 제외 되었기 때문입니다.
$ git status -s
D  testFile
?? testFile



최종적으로 git commit 을 하게 되면 삭제되었다는 내역이 Git 저장소에 커밋되며, ??(Untracked) 상태의 원본파일만 디스크에 남게됩니다.
$ git commit -am 'testFile 삭제!!'
[master b60a85f] testFile 삭제!!
 1 file changed, 2 deletions(-)
 delete mode 100644 testFile

$ git status -s
?? testFile




파일 여러개 동시에 삭제할 경우
파일을 여러개 동시에 삭제하는 경우 file-glob 패턴에 따라 대상 파일들을 지정할 수 있습니다.
애스터리스크를 \* 와 같이 표기했는데 이는 파일명 패턴을 입력하는 기능이 쉘에만 있는것이 아니라 Git 자체에도 있기 때문에 역슬래쉬로 감싸주어야 하는 것입니다.
$ git rm \*.class



참고글


출처 - https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!