如何从git中的索引中删除文件?

时间:2010-02-08 16:58:22

标签: git

如何从索引(= staging area = cache)中删除文件而不将其从文件系统中删除?

6 个答案:

答案 0 :(得分:418)

你想:

git rm --cached [file]

如果省略--cached选项,它也会从工作树中删除它。 git rmgit reset稍微安全一些,因为如果暂存的内容与分支的提示或磁盘上的文件不匹配,则会收到警告。 (如果没有,则必须添加--force。)

答案 1 :(得分:114)

这应该取消暂停< file>为你(不删除或以其他方式修改文件):

git reset HEAD <file>

答案 2 :(得分:1)

git reset HEAD <file> 

用于从索引中删除特定文件。

git reset HEAD

用于删除所有索引文件。

答案 3 :(得分:1)

仅使用git rm --cached [file]从索引中删除文件。

git reset <filename>可用于从索引中删除添加的文件,前提是文件从未提交

% 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

注意:git reset First.txt对提交后的索引没有影响。

这带给我git restore --staged <file>的话题。如果文件从未提交,它可以用来(大概是在第一次提交之后)从索引中删除添加的文件。

% 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 查看最后15行。如果您不想与第一次提交,第二次提交,提交之前,提交之后...混淆,请始终使用git rm --cached [file]

答案 4 :(得分:1)

根据我的拙见和我在git上的工作经验,暂存区与索引不同。我当然可能是错的,但是正如我所说,我使用git的经验和我的逻辑告诉我,索引是一种结构,它遵循您对工作区(本地存储库)所做的更改,而不会因为忽略设置和暂存区而被排除在外是将已确认已提交的文件(也称为文件)保留在运行add命令的索引中。您不会注意到并意识到“轻微”差异,因为您使用 git commit -a -m "comment" 将索引文件和缓存文件添加到暂存区中,然后执行一个命令或频繁使用诸如IDEA之类的IDE。缓存是保持索引文件更改的原因。 如果要从之前未添加到暂存区的索引中删除文件,则建议使用之前建议的选项,但是... 如果您已经这样做,则需要使用

Git restore --staged <file>

请不要问我十年前在哪里... 我想念你,这个答案是给后代的。

答案 5 :(得分:0)

根据您的工作流程,这可能是您需要的东西很少,以至于在尝试找出命令行解决方案时没有什么意义(除非您碰巧在没有图形界面的情况下工作某种原因)。

只需使用一个支持索引管理的基于GUI的工具,例如:

  • git gui&lt; - 使用Tk窗口框架 - 与gitk类似的样式
  • git cola&lt; - 更现代风格的GUI界面

这些允许您通过点击操作将文件移入和移出索引。他们甚至支持从索引中选择和移动文件的各个部分(个别更改)。

如何看待不同的观点:如果你在使用其中一个建议的,相当神秘的命令时陷入困境:

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

...你真的有机会丢失数据 - 或者至少让它很难找到。除非您确实需要以非常高的频率执行此操作,否则使用GUI工具可能更安全

在没有索引的情况下工作

根据评论和投票,我逐渐意识到很多人一直使用索引。我没有。以下是:

  • 提交我的整个工作副本(典型案例):git commit -a
  • 只提交几个文件:git commit (list of files)
  • 提交除少数修改过的文件以外的所有文件:git commit -a然后通过git gui
  • 修改
  • 以图形方式查看对工作副本的所有更改:git difftool --dir-diff --tool=meld