How to remove a file from the index in git?

后端 未结 6 707
[愿得一人]
[愿得一人] 2020-12-07 07:34

How to remove a file from the index ( = staging area = cache) without removing it from the file system?

相关标签:
6条回答
  • 2020-12-07 07:44

    According to my humble opinion and my work experience with git, staging area is not the same as index. I may be wrong of course, but as I said, my experience in using git and my logic tell me, that index is a structure that follows your changes to your working area(local repository) that are not excluded by ignoring settings and staging area is to keep files that are already confirmed to be committed, aka files in index on which add command was run on. You don't notice and realize that "slight" difference, because you use git commit -a -m "comment" adding indexed and cached files to stage area and committing in one command or using IDEs like IDEA for that too often. And cache is that what keeps changes in indexed files. If you want to remove file from index that has not been added to staging area before, options proposed before match for you, but... If you have done that already, you will need to use

    Git restore --staged <file>
    

    And, please, don't ask me where I was 10 years ago... I missed you, this answer is for further generations)

    0 讨论(0)
  • 2020-12-07 07:53

    You want:

    git rm --cached [file]
    

    If you omit the --cached option, it will also delete it from the working tree. git rm is slightly safer than git reset, because you'll be warned if the staged content doesn't match either the tip of the branch or the file on disk. (If it doesn't, you have to add --force.)

    0 讨论(0)
  • 2020-12-07 07:54
    git reset HEAD <file> 
    

    for removing a particular file from the index.

    and

    git reset HEAD

    for removing all indexed files.

    0 讨论(0)
  • 2020-12-07 08:02

    Depending on your workflow, this may be the kind of thing that you need rarely enough that there's little point in trying to figure out a command-line solution (unless you happen to be working without a graphical interface for some reason).

    Just use one of the GUI-based tools that support index management, for example:

    • git gui <-- uses the Tk windowing framework -- similar style to gitk
    • git cola <-- a more modern-style GUI interface

    These let you move files in and out of the index by point-and-click. They even have support for selecting and moving portions of a file (individual changes) to and from the index.


    How about a different perspective: If you mess up while using one of the suggested, rather cryptic, commands:

    • git rm --cached [file]
    • git reset HEAD <file>

    ...you stand a real chance of losing data -- or at least making it hard to find. Unless you really need to do this with very high frequency, using a GUI tool is likely to be safer.


    Working without the index

    Based on the comments and votes, I've come to realize that a lot of people use the index all the time. I don't. Here's how:

    • Commit my entire working copy (the typical case): git commit -a
    • Commit just a few files: git commit (list of files)
    • Commit all but a few modified files: git commit -a then amend via git gui
    • Graphically review all changes to working copy: git difftool --dir-diff --tool=meld
    0 讨论(0)
  • 2020-12-07 08:02

    Only use git rm --cached [file] to remove a file from the index.

    git reset <filename> can be used to remove added files from the index given the files are never committed.

    % git add First.txt
    % git ls-files
    First.txt
    % git commit -m "First"   
    % git ls-files            
    First.txt
    % git reset First.txt
    % git ls-files              
    First.txt
    

    NOTE: git reset First.txt has no effect on index after the commit.

    Which brings me to the topic of git restore --staged <file>. It can be used to (presumably after the first commit) remove added files from the index given the files are never committed.

    % git add Second.txt              
    % git status        
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
        new file:   Second.txt
    % git ls-files       
    First.txt
    Second.txt
    % git restore --staged Second.txt
    % git ls-files 
    First.txt
    % git add Second.txt 
    % git commit -m "Second"
    % git status            
    On branch master
    nothing to commit, working tree clean
    % git ls-files 
    First.txt         
    Second.txt
    Desktop/Test% git restore --staged .
    Desktop/Test% git ls-files
    First.txt                   
    Second.txt
    Desktop/Test% git reset .                    
    Desktop/Test% git ls-files
    First.txt
    Second.txt
    % git rm --cached -r .
    rm 'First.txt'
    rm 'Second.txt'
    % git ls-files  
    

    tl;dr Look at last 15 lines. If you don't want to be confused with first commit, second commit, before commit, after commit.... always use git rm --cached [file]

    0 讨论(0)
  • 2020-12-07 08:09

    This should unstage a <file> for you (without removing or otherwise modifying the file):

    git reset <file>
    
    0 讨论(0)
提交回复
热议问题