Git-与x27之间的差异;假设不变';和';跳过工作树';

Git-与x27之间的差异;假设不变';和';跳过工作树';,git,git-index,Git,Git Index,我对不想提交到存储库的文件进行了本地更改。它是一个用于在服务器上构建应用程序的配置文件,但我希望使用不同的设置在本地构建。当然,当我执行“git status”时,文件总是显示为要暂存的内容。我想隐藏这个特定的更改,而不是提交它。我不会对该文件进行任何其他更改 在仔细研究之后,我看到了两个选项:“假定不变”和“跳过工作树”。前面的一个问题谈到了它们,但并没有真正解释它们之间的差异。我的问题是:这两个命令有何不同?为什么有人会使用其中一个呢?您希望跳过工作树 假设unchanged是为检查一组文件

我对不想提交到存储库的文件进行了本地更改。它是一个用于在服务器上构建应用程序的配置文件,但我希望使用不同的设置在本地构建。当然,当我执行“git status”时,文件总是显示为要暂存的内容。我想隐藏这个特定的更改,而不是提交它。我不会对该文件进行任何其他更改


在仔细研究之后,我看到了两个选项:“假定不变”和“跳过工作树”。前面的一个问题谈到了它们,但并没有真正解释它们之间的差异。我的问题是:这两个命令有何不同?为什么有人会使用其中一个呢?

您希望跳过工作树

假设unchanged
是为检查一组文件是否被修改而设计的;设置位时,
git
(当然)假定与该索引部分对应的文件在工作副本中未被修改。因此,它避免了大量的
stat
调用。每当文件在索引中的条目发生更改时(因此,当文件在上游更改时),该位就会丢失

skip worktree
远不止这些:即使
git
知道文件已被修改(或需要通过
reset--hard
或类似方法进行修改),它也会使用索引中的版本假装未被修改。这将一直持续到索引被丢弃为止

这里对这种差异的后果和典型用例有一个很好的总结:

从该条中:

  • --假定未更改
    假定开发人员不应更改文件。此标志用于提高性能不更改SDK等文件夹
  • --skip worktree
    在您指示git不要触摸特定文件时非常有用,因为开发人员应该更改它。例如,如果主存储库上游承载一些生产就绪的配置文件,并且您不想意外地提交对这些文件的更改,
    --跳过工作树
    正是您想要的
注意:2011年做了一些测试(因此可能已经过时),以下是他的:

操作

  • 文件在本地存储库和上游都已更改
    git pull

    Git仍然保留本地更改。
    因此,您不会意外地丢失用任何标志标记的任何数据。
    • 带有
      的文件假定未更改
      标志:Git不会覆盖本地文件。相反,它将输出冲突以及如何解决冲突的建议
    • 带有跳过工作树标志的文件:Git不会覆盖本地文件。相反,它将输出冲突以及如何解决冲突的建议
  • 文件在本地存储库和上游都已更改,仍在尝试提取
    git隐藏

    git pull

    使用
    skip worktree
    会导致一些额外的手动工作,但如果您有任何本地更改,至少不会丢失任何数据。
    • 带有
      假定未更改
      标志的文件:放弃所有本地更改,不可能恢复它们。其效果类似于“
      git reset--hard
      git pull
      '调用将成功
    • 带有
      跳过工作树
      标志的文件:隐藏在
      跳过工作树
      文件上无效
      git pull
      '将失败,并出现与上述相同的错误。开发人员被迫手动重置
      跳过工作树
      标志,以便能够隐藏并完成失败的
      拉动
  • 无本地更改,上游文件已更改
    git pull

    这两个标志都不会阻止您获得上游更改。Git检测到您违反了
假定未更改的承诺,并通过重置标志选择反映现实。
  • 带有
    标志的文件假定未更改
    标志:内容更新,标志丢失。
    git ls files-v
    ”将显示标志被修改为
    H
    (从
    H
  • 带有
    跳过工作树
    标志的文件:内容更新,标志保留。
    git ls files-v
    ”将显示与
    pull
    之前相同的
    S
    标志
  • 本地文件已更改
    git重置——硬的

    Git不触及
    跳过工作树
    文件,并反映了
    假定未更改
    文件的现实情况(承诺未更改的文件实际上已更改)。
    • 带有
      标志的文件假定未更改
      标志:文件内容被还原。标志被重置为
      H
      (从
      H
    • 带有跳过工作树标志的文件:文件内容完整。旗帜保持不变
他补充了以下分析:

  • 看起来,
    跳过工作树
    正在努力保存本地数据。但是,如果安全的话,它不会阻止您获得上游更改。另外,git不会在
    pull
    上重置标志
    但是忽略“
    reset--hard
    ”命令可能会让开发人员大吃一惊

  • 假设unchanged
    标志可能在
    pull
    操作中丢失,并且这些文件中的本地更改对git似乎并不重要

见:

  • ,

    特别是,Junio指出,对
    的更改假定未更改的
    文件可能会意外提交:“如果Git可以