【问题标题】:how can git commit -a work after i remove a file from index从索引中删除文件后 git commit -a 如何工作
【发布时间】:2021-05-27 22:07:49
【问题描述】:

假设我跟踪了文件empty.txt。 现在我使用 rm empty.txt 从工作目录中删除文件。 现在我正在使用git rm empty.txt 从索引中删除文件,现在应该取消跟踪文件,因为我已将其从索引中删除。 在此之后,我使用了git commit -a -m "remove empty.txt",但它是如何工作的,因为 -a 参数用于跳过将跟踪文件显式添加到暂存区域但我已经从索引中删除了文件? 它应该是未跟踪的。

【问题讨论】:

    标签: git github git-commit rm git-rm


    【解决方案1】:

    最初我认为文档对此很清楚,但经过测试,这里有一个奇怪的案例......

    所以在大多数情况下,-a 标志将跳过索引并应用工作树中的更改。删除文件是一种改变。我对(可能是模棱两可的)文档的阅读表明该索引基本上会被忽略,除了不会添加新文件。

    不过,在上一次提交中的文件被从舞台上删除的情况下,有些奇怪。我的测试表明,在这种情况下,文件从新提交中删除,基于从索引中删除;然后忽略工作树中的任何进一步更改(即,如果重新创建了文件)。从这个意义上说,OP 观察到的内容是一致的——从阅读文档中很难理解这一点。

    这太糟糕了,因为它破坏了一堆看似真实的描述行为的简单陈述;但这里是:

    git init
    touch file1
    git add .
    git commit -m "initial commit"
    
    echo CHANGES > file1
    git rm --cached file1
    git status
    
    # this will show a staged change to remove the file, and an untracked file
    # with the CHANGES
    
    git commit -a -mtest
    

    ...现在提交有一个空目录,file1 未被跟踪。考虑到这一点,问题中的情况只是工作树中的更改与索引中的更改相同的退化情况。

    【讨论】:

      【解决方案2】:

      你有两个可能的误解:

      • 这与“跟踪”无关。

      • git 提交与更改无关。它是整个文件集的快照、照片,反映在索引中,它本身就是整个文件集的完整副本。

      如果您拍摄一只狗站在两棵树之间的照片,则该照片包含一只狗和两棵树。这是一个提交。

      如果狗走开,而您再拍一张照片,则照片包含两棵树,但 狗。你拍那张照片时它不在那里。那是另一个提交。

      第二次提交的创建不涉及“删除”操作。这不是对第一张照片的修改。这只是一张照片。

      在您创建的 git 提交的情况下,“是什么”是索引,简单明了(默认情况下;有一些方法可以解决这个问题,比如 git commit someFile,但出于我们的目的忽略它)。


      好的,那么,关于您的问题的详细信息。你说:

      我使用rm empty.txt从工作目录中删除文件

      现在我正在使用git rm empty.txt从索引中删除文件

      之后我使用了git commit -a

      所以:

      • 如果您从工作树中删除一个文件,git commit -a 也会在提交之前自动从索引中删除该文件(就像通过调用 git rm --cached)。该文件现在不在索引中,因此从它创建的提交丢失了该文件(就像狗一样)。

      • 在您的情况下,您自己从工作树索引中删除了文件。因此,就该文件而言,现在git commit -a-a 部分与索引无关;你已经完成了这项工作。现在发生了同样的操作:文件现在不在索引中,因此从它创建的提交丢失了该文件(就像狗一样)。

      【讨论】:

      • 这是 100% 错误的,所以它被赞成和接受有点奇怪。 -a 提交选项absolutely 与未跟踪的文件有关,提交过程sbsolutely 是关于识别上一个快照和正在创建的新快照之间的差异。
      猜你喜欢
      • 2014-02-05
      • 2019-09-20
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多