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


355

如何从索引(=暂存区=缓存)中删除文件而又不从文件系统中删除文件?


5
您是说“重置为之前的状态”还是“由于不再需要该文件而删除”?
Andrew Aylett

就我而言,这是相同的,因为文件之前不存在...
hcs42 2010年

Answers:


504

你要:

git rm --cached [file]

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


8
例如,如果您不小心签入了一些未放入.gitignore的构建中间件或本地配置文件,这也将非常有用。用于git rm --cached从存储库中删除它们,将相关文件或目录添加到.gitignore中,照常进行暂存和提交。它们将从存储库中删除,但在您的本地树中保持不变,并且您不会无意中再次将它们检入。
Ionoclast Brigham 2014年

22
提交并推送后,这还会从回购(远程)中删除文件。
powder366

6
这不会将其从索引中删除,而是在索引中将其标记为已删除。
JotaBe

4
这个答案很可能是错误的,因为它从回购协议中删除了一个文件(如已经提到的@ powder366),这不是预期的结果。
otomo

1
该解决方案对我不起作用。它将指定的文件标记为已删除,然后将其从本地存储库中删除。
paiego '19

134

这应该为您取消暂存<file>(而不删除或修改文件):

git reset <file>

6
这将删除特定文件的最新更改,但在提交和推送后将其保留在存储库(远程)中。
powder366

1
这是我一直在寻找的答案。请注意,您不必指定HEAD
迈克尔·多斯特

好点@MichaelDorst。我已将答案更新为忽略HEAD
大卫·安德希尔


1

根据您的工作流程,这可能是您几乎不需要的东西,因此试图找出命令行解决方案毫无意义(除非您由于某种原因碰巧没有图形界面工作)。

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

  • git gui <-使用Tk窗口框架-类似于 gitk
  • git cola <-更现代的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

@马丁:我想这取决于您的工作流程。在我的方法中,我从不直接使用索引。当我要保存工作时,只需使用进行完全提交git commit -a。当我回答这个问题时,是因为我做了(一个异国情调的)“ 反向樱桃挑选 ”,将文件放入索引中,但是我想在提交之前编辑文件。在编辑文件时,我从索引中取出了文件,以便差异可以按照我以前的方式工作。
nobar 2015年

我的使用案例非常狭窄,实际上毫无用处:创建分支;添加充满文件的文件夹,仅用于分支;切换到主人 合并; 操作,将错误的文件夹添加到master,将其添加到gitignore; 文件不会从提交中删除-当然,更好的解决方案是直接使用rm,但是我首先认为切换分支不会杀死被忽略的文件夹。但是 ...我确实使用了对我足够好的github“基于gui”工具,并且除了不支持索引管理之外,还支持一些索引管理。那我应该用2 gui来缩小范围吗?仍然不同意答案。
cregox '16

3
这是绝对不受欢迎的答案。但是,我非常确定我建议的方法对某些人(包括我自己)是正确的。我每年使用几次这些工具之一来操作索引。
nobar

1
如今,编程编辑器和IDE可能支持图形索引操纵。至少GitHub的Atom做到了。
nobar

1
我更喜欢cli接口,而不是gui,尽管它更危险。它甚至可以让我在没有gui的情况下使用git(我不会感到欣慰)(而不是当我无法在远程服务器上安装此类工具时迷路)。所有这些都说明了这个答案是完全正确的,不值得“ cli eliteist”下注,+ 1提供了一个不错的gui替代方案!
SidOfc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.