【问题标题】:Why does git checkout not delete new files?为什么 git checkout 不删除新文件?
【发布时间】:2019-02-02 06:16:10
【问题描述】:

假设我创建(但不提交)一个文件file.txt,然后键入git checkout HEADgit checkout HEAD .。我认为git checkout 基本上用你提交的快照覆盖了你当前的工作文件,所以我认为这会删除file.txt。但事实并非如此。为什么?

【问题讨论】:

  • 好吧,因为你的假设是错误的。 git checkout 不会影响未跟踪的文件。
  • Git 只管理被跟踪的文件,它非常努力地避免让你丢失数据(这很关键)。
  • @SergioTulentsev 我认为这不是一个很好的表达方式。 “未跟踪”只是意味着“现在不在暂存区”。 git checkout 仍然会修改与上次提交时不同的文件,即使您没有暂存这些更改。
  • @JackM 不,这不是 git 中“未跟踪”的意思。
  • Git 书籍并没有真正不同意:索引通常由 via git checkout 填充,所以索引中现在的内容是那些在快照中。但是,如果您更改索引(例如使用git rm --cachedgit add),则会更改跟踪文件集。还要注意git checkout <tree-ish> <paths>git checkout <branch> 是一个非常不同的命令。一些人(包括我自己)认为它应该使用不同的拼写,即根本不以 git checkout 开头。

标签: git version-control git-checkout git-reset git-clean


【解决方案1】:

git checkout 不会按设计覆盖您的工作副本。

它的工作方式与 git reset --hard 相同,但有一个重要区别 - git checkout工作目录安全,因此它不会覆盖您工作目录中的现有更改。实际上,它更聪明一点 — 它尝试在工作目录中进行简单的合并。

因此,如果您想放弃所有更改并仅从 HEAD 获取快照,请改用 git reset --hard HEAD 或仅使用 git reset --hard

但即使git reset --hard 也不会删除您的未跟踪文件。要删除未跟踪的文件:

  • 运行git clean --dry-run。它只是告诉您将要删除的内容。这样做是因为清洁是一个危险的命令。
  • 运行 git clean --force 最终删除未跟踪的文件。

您可以找到有关git checkoutgit reset here 以及清洁here 的更多详细信息。

【讨论】:

    【解决方案2】:

    file.txt,未被跟踪,对 Git 是“不可见的”。如果您签出的提交中有另一个名为 file.txt 的文件,它可以作为签出的副作用被覆盖,但 Git 不会特意删除未跟踪的文件.

    【讨论】:

    • 因此,如果我删除或修改了上一次提交中的文件,并签出该提交,该文件将被还原,但这只是作为“副作用”?
    • @JackM 实际上,在这种情况下您会得到结帐错误。 Git 会强迫你对未决的更改做一些事情,因为它不知道你在这里的意图是什么。你只是忘记提交了吗?
    • @SergioTulentsev 这不是真的。 Git 没有给我任何错误,并将修改后的文件恢复到以前的状态。
    • @JackM:在做git checkout .git checkout <ref> 时?我描述的是后者。
    • @SergioTulentsev git checkout HEAD . - 如果我只是做git checkout HEAD 它什么也没做,但它也没有给我一个明显的错误(它打印出一条关于修改的消息文件,不过,我猜这就是你的意思)。
    猜你喜欢
    • 2021-03-03
    • 2017-12-16
    • 2016-01-15
    • 2020-05-19
    • 2012-06-24
    • 2016-09-09
    • 2019-05-30
    • 1970-01-01
    • 2011-10-18
    相关资源
    最近更新 更多