为什么在运行git reset --hard HEAD时出现“未跟踪文件”错误?

时间:2019-01-24 19:42:23

标签: git debugging github

运行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呢?我以为会因为所有内容都已重置而触发自动进行更改?

我该怎么做才能克服这个困难?

2 个答案:

答案 0 :(得分:2)

要做的正是Git告诉您的事情:提交public/appName/js/password-change.js或将其移开。

  

git reset --hard HEAD是否不应该将我在分支机构中所做的一切重置为以前的样子?

不完全是。或更确切地说,就是 just 那不是您想要和/或想要的。

Git始终具有每个 tracked 文件的三个“活动”版本。当前提交中有一个文件副本,该文件被冻结为任何提交者进行提交时的形式。在这里,它也被压缩并以仅Git的形式存储,以占用更少(也许更少)的空间。 Git调用的地方有一个 second 副本,分别是 index 临时区域或有时是缓存,具体取决于Git的谁/哪个部分正在执行调用。索引副本也采用仅Git的形式,但并不完全冻结-更加泥泞,易于冻结。最后,第三个副本是您可以使用并看到的副本:工作树中的一个副本,它具有正常形式,因此您可以使用它来进行处理。

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

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

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

相比之下,

未跟踪的文件是不在索引中的文件。 (它必须在您的工作树中,否则它就不存在了。如果在提交中,git reset --hard会将它带回到索引和工作树中。)

无论如何,如果现在不在索引中,那么 you 会将其从索引中删除,或者它永远不会存在于索引中。后者往往更常见,因为通常使用git rm file从索引中删除文件,这会同时从索引和工作树中删除文件。并且,我们可以确定它不在您的HEAD提交中,因为如果存在,git reset --hard会将其重新带入索引(并用提交的副本覆盖工作树副本)。 / p>

因此,您在工作树中创建了一个文件-您或某人或某物,该文件肯定是在索引中还是在当前提交中不是 。现在,通过运行git pull,您告诉Git运行git merge。 (请注意,git pull表示先运行git fetch,然后再运行第二个Git命令,通常是git merge 。显示的输出表明,您得到的不仅仅是{ {1}},但具体来说是快进合并,它根本不是真正的合并,但有很多相似之处。)

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

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

git merge

这是未跟踪的-不在您的索引中。 他们负责该文件的版本。 Git没有此文件您的版本的冻结副本,以确保安全。使用public/appName/js/password-change.js 只需将它们的副本git merge 覆盖。因此,public/appName/js/password-change.js告诉您该文件已在路上:您应该提交该文件,以便拥有一个冻结的副本来保护它的安全,或者将其移开,以便git merge可以写他们的复制到位。

答案 1 :(得分:1)

两件事:

1)命令为git reset --hard HEAD

2)即便如此,即使文件未跟踪,git也不会在硬重置(或大多数其他操作)期间默认将其删除。它希望确保只有在明确地告知时才执行此操作,因为如果这样做,则因为该文件未跟踪,您将无法恢复它。

如果您确实确定要删除本地未跟踪的文件,则可以使用git cleanhttps://git-scm.com/docs/git-clean