suchen

Heim  >  Fragen und Antworten  >  Hauptteil

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 还能恢复到暂存区?为什么没有彻底删除掉?

習慣沉默習慣沉默2791 Tage vor591

Antworte allen(7)Ich werde antworten

  • PHPz

    PHPz2017-05-02 09:49:07

    新手呀。。。写点儿教程呗。。。。。

    从原理上说, git 在本地有三个不同的保存文件的位置。

    1. Working tree: 这个代表的就是你能看到的所有文件以及文件夹

    2. index: 这个其实是和下面的版本库一样都保存在.git文件夹里面(在此不讨论保存的格式)

    3. 版本库: 保存了所有提交的版本。

    在所有东西都提交之后,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和最新已经提交版本的区别(默认是绿色?深绿?)。另外会有提示如果在他们之间相互更新的方法。

    Antwort
    0
  • 为情所困

    为情所困2017-05-02 09:49:07

    try git rm filename

    Antwort
    0
  • 巴扎黑

    巴扎黑2017-05-02 09:49:07

    题主首先需要知道 git 为什么需要 add 这个操作,因为 git 最开始是只有命令行的,所以 add 的操作相当于 GUI 下的文件选中操作,因此 add 和 commit 操作应该看成一个整体(就像 GUI 下选中文件就可以提交了),而不应该割裂开来。

    Antwort
    0
  • 滿天的星座

    滿天的星座2017-05-02 09:49:07

    1.git add b.txt //把b.txt从工作区添加到暂存区(stage)
    2.rm b.txt //把工作区的b.txt删除,但没有执行git rm b.txt从版本库中删除该文件
    3.git commit -m '删除b.txt文件'//由于没有执行git rm b.txt,commit提交的只是1中的内容
    -->2,3之间应该执行git rm b.txt,才能把文件删除

    Antwort
    0
  • 阿神

    阿神2017-05-02 09:49:07

    提醒下楼主注意,在git中修改文件名和删除文件其实是差不多的,就像楼上说的,要使用git rm和git mv命令来分别操作,有本书叫做git权威指南,楼主可以好好看看

    Antwort
    0
  • 巴扎黑

    巴扎黑2017-05-02 09:49:07

    .删除文件:
      在工作区中删除一个文件,rm 文件名
      有两种情况:
         第一种情况:需要版本库中也删除该文件.
          git rm 文件名
          git commit -m '描述'
         第二种情况:误删除该文件
          git checkout -- 文件名

    Antwort
    0
  • 巴扎黑

    巴扎黑2017-05-02 09:49:07

    少加了一个git rm前面

    Antwort
    0
  • StornierenAntwort