微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Git:如何取消跟踪文件而不将其暂存以进行删除

如何解决Git:如何取消跟踪文件而不将其暂存以进行删除

我有一些要在本地更改的配置文件,但不冒意外提交这些更改的风险。也不能将它们添加到gitignore中,因为需要在整个项目中对其进行跟踪。当我修改这些文件以满足环境的需要时,我的git status如下所示:

Changes not staged for commit:
    (use "git add <file>..." to update what will be committed)
    (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   config1.cfg
        modified:   config2.cfg

Untracked files:
    (use "git add <file>..." to include in what will be committed)

        whatever.html
        somethingElse.js

然后我跑步:

git rm --cached config1.cfg config2.cfg

git status看起来像这样:

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    config1.cfg
        deleted:    config2.cfg

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    config1.cfg
    config2.cfg
    whatever.html
    somethingElse.js
    

运行git reset --HEAD config1.cfg config2.cfg可以将它们返回到暂存区域。但是,即使某个阶段是为了删除,也可能无法跟踪某些内容并仍在上演,这是没有意义的。而且-我没有删除文件,但是如果我现在提交,则它们将被删除

我意识到这可能是污迹和清洁过滤器的更好用例,但是是否有可能达到先前跟踪的文件未跟踪且好像从未跟踪过的状态?如果没有,是否有充分的理由不可能呢?

现在进行编辑以使我更好地了解情况:我正在尝试创建的方案是在工作时在本地本地对文件进行不跟踪的情况,而不会影响远程文件的跟踪状态。 / p>

解决方法

但是如果我现在提交,那么它们将被删除。

不。 文件(您在工作树中看到的东西)不会被删除。提交对工作树没有影响。

commit 会将它们记录为已删除,因为必须这样做,因为它们在上一次提交中存在,现在您要说它们在下一次提交中不应该存在。那就是删除的意思:存在的东西现在不再存在。

Git的三个地方

听起来您可能会从了解Git的“含义”中受益。 Git练习在三个地方摇摆:

  • 工作树。这就是Git向您显示的内容。这是一个充满文件的文件夹到磁盘上的呈现,以便您可以编辑这些文件。

  • 索引。也称为暂存区或缓存。这是文件的引用的不可见集合,这些文件构造了您的下一次提交将组成的内容。

  • 实际的存储库 commits 的不可见集合。提交本身每个都包含文件,从某种意义上来说,“包含”一词在这里并不重要。

签出分支时,即签出提交。提交用于填充工作树和索引。他们那时都匹配。

如果您在工作树中更改一个文件(这是您唯一可以更改任何内容的位置)并添加并提交,那么只有一个文件更改了,是的,但其他所有文件都更改了文件仍在工作树和索引中,因此此提交包含所有文件-不仅仅是您更改的文件(这是一种常见的误解)。每个提交都是创建索引时索引的整个状态的快照,这又反映了工作树的整个状态,由您选择添加到索引中的内容。

因此索引是您可以操纵您在工作树中所做的操作与下一次提交将要进行的操作之间的关系的地方。当您说git add .时,实际上是在说:“索引应该反映我在工作树中所做的所有事情”。但这是一个非常广泛的命令。您可以完全逐个文件地精确控制索引在下一次提交之前的外观。

你做了什么

当您说git rm --cached config1.cfg时,您说:“将引用 index 移至 config1.cfg 。”提交时,这对工作树没有影响;只会提交 config1.cfg 不存在的提交。

但是现在您正在考虑这一点,并且您意识到这并不是您要说的,因为下一次提交将构成 config1.cfg 删除 >。你不喜欢那样您要做,希望下一次提交仍包含 config1.cfg ;您只是不希望在上一次提交中对它们进行更改

我认为这就是您说的意思:

我有一些要在本地更改的配置文件,但不冒意外提交这些更改的风险

您应该做什么

您的目标不是在不存在 config1.cfg 的情况下进行提交。您的目标是进行提交,在该提交中 config1.cfg 与以前的状态保持不变 ,即使您实际上已经在工作树中对其进行了编辑。

好的,那么您应该怎么做才能做到这一点?好吧,第一道防线是:不要说git add .或类似的笼统的全球言论。相反,为了将更改的文件添加到索引,请不要添加它们。只需将您要在下一次提交中反映的更改文件添加到索引中即可。

但是,假设您不计后果地吹嘘了该保护措施,并且将 config1.cfg 更改后的状态添加到了索引中。 (您确实这样做了。)然后说git restore --staged config1.cfg。这会将 config1.cfg 从上次提交(每个提交都包含所有文件,还记得吗?)中复制到索引中。因此,现在索引中的 config1.cfg 看起来像以前的提交,而不像工作树版本。这样的状态将是git知道您已经在工作树中修改了 config1.cfg (除非您已将其添加到gitignores文件中),但是更改是 not 包含在您下一次提交中。

(在Git 2.25.0之前,您应该使用git reset的形式来实现此目标,即git reset config1.cfg。但是git reset令人恐惧,因此如果您有足够的能力新的Git,请改用restore。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?