如何从Git的暂存区(= index = cache)中删除文件?

w8ntj3qf  于 2023-05-27  发布在  Git
关注(0)|答案(7)|浏览(145)

编辑这个问题可以从两个方面来理解,两种情况下的最佳答案是不同的。

  • 问题1:我将一个以前未跟踪的文件添加到暂存区。如何在不将此文件从文件系统中删除的情况下将其从临时区域中删除?

答案1:使用以下命令,如John Feminella's answer中所述:

git rm --cached <file>
  • 问题2:我修改了一个已跟踪的文件,并将修改添加到暂存区。如何从临时区域中删除修改?也就是说,我如何在文件中取消暂存我的修改?

答案2:使用以下命令,如David Underhill's answer中所述:

git reset <file>
ccrfmcuu

ccrfmcuu1#

您需要:

git rm --cached [file]

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

5anewei6

5anewei62#

这将为您取消暂存a(而不删除或以其他方式修改文件):

git reset <file>
qv7cva1a

qv7cva1a3#

git reset HEAD <file>

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

git reset HEAD
用于删除所有索引文件。

yks3o0rb

yks3o0rb4#

仅使用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在提交后对index没有影响。

这就引出了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]

smdncfj3

smdncfj35#

根据我的拙见和我使用git的工作经验,staging area和index是不一样的。当然,我可能是错的,但正如我所说的,我使用git的经验和我的逻辑告诉我,索引是一种结构,它遵循你对工作区(本地存储库)的更改,这些更改不会被忽略设置和暂存区所排除,它是为了保存已经确认要提交的文件,也就是运行add命令的索引中的文件。您没有注意到并意识到这一“细微”差异,因为您使用git commit -a -m "comment"将索引和缓存文件添加到暂存区域,并在一个命令中提交,或者使用IDEA等IDE进行提交。而缓存就是在索引文件中保存更改的东西。如果要从以前未添加到临时区域的索引中删除文件,则之前建议的选项适合您,但是...如果您已经这样做了,您将需要使用

Git restore --staged <file>

别问我10年前在哪里...我想念你,这个答案是为了更远的世代)

qv7cva1a

qv7cva1a6#

根据您的工作流程,这可能是您很少需要的东西,因此尝试找出命令行解决方案没有什么意义(除非您出于某种原因碰巧在没有图形界面的情况下工作)。
只需使用一个支持索引管理的基于GUI的工具,例如:

  • git gui <--使用Tk窗口框架--类似于gitk
  • git cola <--更现代风格的GUI界面

这些选项允许您通过点击将文件移入或移出索引。它们甚至支持在索引中选择和移动文件的一部分(单独的更改)。
换个Angular 看:如果你在使用建议的、相当隐晦的命令时搞砸了:

  • 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
gg0vcinb

gg0vcinb7#

git rm --cached -r .
用于从临时区域中删除所有文件

相关问题