Git 彻底删除文件?
问题描述
git add b.txt
rm b.txt
git commit -m '删除b.txt文件'
我执行了第三行commit
之后提示
On branch master
Changes not staged for commit:
deleted: b.txt
no changes added to commit
然后我再git checkout -- b.txt
还能恢复到暂存区?为什么没有彻底删除掉?
新手呀。。。写点儿教程呗。。。。。
从原理上说, git 在本地有三个不同的保存文件的位置。
Working tree: 这个代表的就是你能看到的所有文件以及文件夹
index: 这个其实是和下面的版本库一样都保存在
.git
文件夹里面(在此不讨论保存的格式)版本库: 保存了所有提交的版本。
在所有东西都提交之后,WorkingTree、index 区和版本库中最新的提交内容是一模一样的。
git add
的意思是用 WorkingTree中的文件替换/更新index区中的文件。因此git add b.txt
之后就是用当前保存的b.txt
更新index中的 b.txt 文件。
rm b.txt
仅仅是一条 linux 命令,就是删除文件的意思。对git来说这样只是在WorkingTree中删除了b.txt
。
git commit
的意思是把 index 中的文件打包起来放入版本库。由于此时b.txt
还在 index 区,所以git commit
仍旧会把b.txt
更新到版本库中。
Changes not staged for commit:
deleted: b.txt
这里显示了当前WorkingTree和index区的区别:
当前WorkingTree中删除了b.txt
文件,但是index还存在这个文件。
no changes added to commit
这个提示应该说是一个警告,由于git commit
的意思是把index区的内容打包放入版本库,可是由于之前commit过了,而且没有add新的东西,所以index区的内容和最新提交是一样的,git没有必要再保存一次,所以显示没有东西可以commit
git rm
这条命令的意义是从index区和WorkingTree中删除某个文件,所以git rm b.txt
之后index中就没有了b.txt
。 就这样
git checkout <branch>
的意思是用branch中最新的提交更新WorkingTree和index区中的内容。由于不可逆,所以如果这两个地方的内容没有提交到版本库的话这条命令会给出提示。git checkout -- filename
的意思是用index区的内容替换WorkingTree的某个文件--
是可选的,表明这个参数之后的都是文件名。(因为有些时候分支/Tag有可能与文件重名)
额外附送一条命令。。。git status
这个的意思是显示 WorkingTree和index区的不同(默认是红色),index和最新已经提交版本的区别(默认是绿色?深绿?)。另外会有提示如果在他们之间相互更新的方法。
这篇关于Git 彻底删除文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!