首页 > 解决方案 > 为什么在运行 git reset --hard HEAD 时出现“未跟踪文件”错误?

问题描述

运行后git reset hard --HARD,我运行git pull并收到以下错误:

User-MacBook-Air:appName User$ git reset --hard HEAD
HEAD is now at d32cc09 initial test
Users-MacBook-Air:appName User$ git pull
Updating d32cc09..35ece16
error: The following untracked working tree files would be overwritten by merge:
        public/appName/js/password-change.js
Please move or remove them before you merge.
Aborting

git reset hard --HARD应该将我在分支中所做的一切重置为以前的方式吗?如果是这样,那么为什么Aborting在尝试引入新代码时会出现这种情况?我认为它会触发自动进行更改,因为所有内容都已重置?

我能做些什么来克服这个问题?

标签: gitdebugginggithub

解决方案


做什么正是 Git 告诉你的:要么 commit public/appName/js/password-change.js,要么把它移开。

git reset --hard HEAD应该将我在分支中所做的一切重置为以前的方式吗?

不完全是。或者更确切地说,正是这样,但这不是你想要和/或想要的。

Git 始终拥有每个跟踪文件的三个“活动”版本。当前提交中存在该文件的一个副本,当任何人提交时,它都会被冻结成它所具有的任何形式。在这里,它也被压缩并以仅 Git 的形式存储,以占用更少(可能更少)的空间。在 Git 调用的地方有第二个副本,不同的是indexstaging area,或者有时是缓存,取决于 Git 的谁/哪个部分正在执行调用。索引副本也是仅 Git 的形式,但没有完全冻结——更像是泥泞的、随时可以冻结的。最后,第三个副本是您可以使用和查看的副本:工作树中的副本,它具有正常形式,因此您可以使用它/使用它。

git reset --hard所做的是重新设置这三个文件中的每一个的所有三个副本,以便它们都与当前 ( ) 提交中的那个相匹配HEAD。好吧,它可以做得更多,但在这种情况下,它就是这样做的。但这并没有解决重要的问题。

如果某些文件被跟踪,这意味着其他文件未被跟踪。这就是 Git 在这里抱怨的:一个未跟踪的文件。那么:这到底是什么意思?到底什么是跟踪文件?

被跟踪的文件是现在在索引中的文件。就是这样——真的就这么简单。您签出的提交中的文件从该提交进入索引,并且可能仍然存在。因此,提交中的文件位于索引和工作树中。使用git reset --hard将重新设置索引和工作树副本。

相比之下,未跟踪文件不在索引中的文件。(它必须在你的工作树中,否则它根本不存在。如果它在提交中,git reset --hard将把它带回索引和工作树。)

无论如何,如果它现在不在索引中,那么要么将它从索引中删除,要么它从一开始就不存在。后者往往更常见,因为通常您使用从索引中删除文件,这会将其从索引和工作树中删除。而且,我们可以确定它不在您的提交中,因为如果是,会将其带回您的索引中(并用提交的副本覆盖工作树副本)。git rm fileHEADgit reset --hard

所以你有一个文件,你或某人或某事在工作树中创建,肯定不在索引中,也不在当前提交中。现在,通过运行git pull,你告诉 Git 运行git merge。(注意这git pull意味着运行,然后运行git fetchgit merge第二git mergeGit 命令,通常是相似之处。)

合并必须将您当前的工作(无论是什么)与其他人的工作合并,无论其他人是谁。为此,Git 必须找出他们做了什么,并将其与您所做的结合起来。虽然我们无法从您发布的内容中确切地看到他们做了什么,但他们所做的包括添加一个新文件

他们添加的新文件是您未跟踪的文件。 也就是说,你有:

public/appName/js/password-change.js

这是未跟踪的 - 不在您的索引中。 他们委托该文件的一个版本。Git 没有此文件版本的冻结副本确保其安全。使用git merge只会用他们的副本覆盖您的副本。public/appName/js/password-change.js所以git merge告诉你这个文件有问题:你应该提交它,这样你就有一个冻结的副本来保证它的安全,或者把它移开,这样就git merge可以将他们的副本写入到位。


推荐阅读