【问题标题】:Can't reset a file to a specific commit using Git无法使用 Git 将文件重置为特定提交
【发布时间】:2010-12-14 17:03:09
【问题描述】:

我有一个修改过的文件,我想恢复到最新提交中的任何内容,但它“卡在”那里总是被标记为已修改。

$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   index.php
#
no changes added to commit (use "git add" and/or "git commit -a")

然后我试试:

$git checkout -- index.php

但是 git status 的输出还是一样的。然后我尝试:

$git reset --hard master
HEAD is now at 02c9613 test commit message

而且 git status 的输出还是一样的。

关于如何摆脱对该文件的假定更改有什么想法吗?

【问题讨论】:

  • 有哪些修改?
  • git diff 的结果是什么。闻起来像stackoverflow.com/search?q=[git]+autocrlf
  • 差异主要显示行尾更改。请注意,我根本没有更改此文件。这来自团队的一位新成员。我会看看 Rudi 的链接。
  • 如果“文件”实际上是一个文件夹,并且差异表明该行从Subproject commit hash1 更改为Subproject commit hash2,这意味着您的项目中有一个子模块,您需要对其进行更新。在这种情况下,请执行git submodule foreach git pull。如果现在显示hash1 更改为hash3,请进入子模块文件夹(“文件”)并执行git checkout hash1。还有other ways to do the submodule update,但这对我有用。

标签: git git-checkout git-reset


【解决方案1】:

您可能会遇到whitespace issue 尝试git config --global apply.whitespace nowarn

如果这不起作用,我会说你遇到了错误。保存本地克隆以供将来参考(我希望它不会太大)并创建错误报告。尤其是以下事实:

  • 您没有自己修改文件
  • 其他文件未显示此问题

有迹象表明,这里可能不是你犯了错误。您是否可以在干净的 repo 上重现问题也是有趣的信息。

【讨论】:

  • 再次克隆了 repo,它工作正常。不过,似乎无法在新的 repo 中重现该错误。不幸的是,这里的代码不是开源的,所以我不能真正在错误报告中提交它:(
【解决方案2】:

您必须从“索引”中删除 index.php。那你可以签出一个不同的版本吗?

git rm --cached index.php

应该做的伎俩。见:

http://www.kernel.org/pub/software/scm/git/docs/git-rm.html

【讨论】:

  • Julian 的 git status 输出没有显示任何内容被添加到索引中。
  • Mike,当我运行 git rm 命令时,git 要我提交看起来很奇怪的更改,因为我不想与这个文件有任何关系;我只是希望它与 github 中显示的完全一样。
【解决方案3】:

你试过了吗:

$ git checkout master -f -- index.php

$ git checkout master -f

?

如果reset 不这样做,我不明白为什么这会起作用,但值得一试。

【讨论】:

  • Gauthier,你提到的第一个命令没有效果。但是第二个做了一些非常有趣的事情。虽然一开始它没有做任何事情,但我决定修改一些其他文件,并且 git status 将其标记为已修改。在我运行你的第二个建议后,我修改后的文件恢复到原来的状态,而 index.php 仍然保持修改状态!我非常接近再次从原点克隆 repo。
  • 我建议按照上面的建议运行git diff
【解决方案4】:

试试git ls-files -m | xargs -i git update-index --assume-unchanged "{}"

【讨论】:

  • 请注意,您必须删除该标志才能再次使用--no-assume-unchanged查看更改
【解决方案5】:

FWIW,我能够通过删除显示已修改的目录中的 .git 子目录来解决此问题。一旦 .git 子目录(因为子目录本身就是 .git 项目)消失,父文件夹不再显示已修改。如果有问题的文件与不相关的 .git 文件夹位于同一文件夹中,这也可能会产生影响。

【讨论】:

    【解决方案6】:

    我陷入了同样的混乱。我在git status 中有一些我无法摆脱的文件。在尝试以任何方式重置或签出文件后,我决定实际添加有问题的文件并提交它们。 Git 似乎对此很满意。 然后我回到上一次提交,问题解决了,问题文件确实消失了。

    它没有解释错误,但如果这个解决方案可以解决它,那已经是一件好事了。

    【讨论】:

      猜你喜欢
      • 2011-05-17
      • 1970-01-01
      • 2016-12-24
      • 2018-09-08
      • 2016-06-17
      • 2021-04-02
      • 2010-11-13
      • 1970-01-01
      相关资源
      最近更新 更多