How can I delete a file from a Git repository?

后端 未结 24 2016
無奈伤痛
無奈伤痛 2020-11-22 13:41

I have added a file named \"file1.txt\" to a Git repository. After that, I committed it, added a couple of directories called dir1 and dir2

24条回答
  •  太阳男子
    2020-11-22 13:55

    git rm file.txt removes the file from the repo but also deletes it from the local file system.

    To remove the file from the repo and not delete it from the local file system use:
    git rm --cached file.txt

    The below exact situation is where I use git to maintain version control for my business's website, but the "mickey" directory was a tmp folder to share private content with a CAD developer. When he needed HUGE files, I made a private, unlinked directory and ftpd the files there for him to fetch via browser. Forgetting I did this, I later performed a git add -A from the website's base directory. Subsequently, git status showed the new files needing committing. Now I needed to delete them from git's tracking and version control...

    Sample output below is from what just happened to me, where I unintentionally deleted the .003 file. Thankfully, I don't care what happened to the local copy to .003, but some of the other currently changed files were updates I just made to the website and would be epic to have been deleted on the local file system! "Local file system" = the live website (not a great practice, but is reality).

    [~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
    error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
    (use --cached to keep the file, or -f to force removal)
    [~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
    rm 'shop/mickey/mtt_flange_SCN.7z.003'
    [~/www]$ 
    [~/www]$ git status
    # On branch master
    # Changes to be committed:
    #   (use "git reset HEAD ..." to unstage)
    #
    #   deleted:    shop/mickey/mtt_flange_SCN.7z.003
    #
    # Changed but not updated:
    #   (use "git add ..." to update what will be committed)
    #   (use "git checkout -- ..." to discard changes in working directory)
    #
    #   modified:   shop/mickey/mtt_flange_SCN.7z.001
    #   modified:   shop/mickey/mtt_flange_SCN.7z.002
    [~/www]$ ls shop/mickey/mtt_flange_S*
    shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
    [~/www]$ 
    [~/www]$ 
    [~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
    rm 'shop/mickey/mtt_flange_SCN.7z.002'
    [~/www]$ ls shop/mickey/mtt_flange_S*
    shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
    [~/www]$ 
    [~/www]$ 
    [~/www]$ git status
    # On branch master
    # Changes to be committed:
    #   (use "git reset HEAD ..." to unstage)
    #
    #   deleted:    shop/mickey/mtt_flange_SCN.7z.002
    #   deleted:    shop/mickey/mtt_flange_SCN.7z.003
    #
    # Changed but not updated:
    #   modified:   shop/mickey/mtt_flange_SCN.7z.001
    [~/www]$
    

    Update: This answer is getting some traffic, so I thought I'd mention my other Git answer shares a couple of great resources: This page has a graphic that help demystify Git for me. The "Pro Git" book is online and helps me a lot.

提交回复
热议问题