由于对未更改的文件进行更改,Git拒绝合并。

8
我遇到了一个git问题,我想把一个分支合并到主分支,但它拒绝合并,因为它认为我对文件进行了本地更改。执行status命令显示没有更改,并且比较文件也没有产生任何变化。以下是终端输出结果:
$ git checkout ProductsAndContents
Switched to branch 'ProductsAndContents'

$ git status
# On branch ProductsAndContents
nothing to commit (working directory clean)

$ git checkout master
Switched to branch 'master'

$ git status
# On branch master
nothing to commit (working directory clean)

$ git merge ProductsAndContents
error: Your local changes to the following files would be overwritten by merge:
    tests/unit/src/models/BrandTests.js
Please, commit your changes or stash them before you can merge.
Aborting

任何帮助或建议都将不胜感激!

1
你是否成功将该文件放入了.git/info/exclude文件或.gitignore文件中? - Jonathan Wakely
2
这个答案中的配置选项是否有帮助? - asm
嗨,安德鲁,将 core.trustctime 设置为 false 似乎解决了问题。谢谢你指引我正确的方向 :) - Mark Stickley
4个回答

3

感谢安德鲁·迈尔斯在我最初的问题上的评论,我发现将core.trustctime设置为false可以解决这个问题。

git config core.trustctime false

关于不匹配的inode更改时间的问题,我猜测这是因为仓库位于一个与我使用的文件系统不同的机器上的文件共享中。

感谢所有的建议!


1

如果你有信心不会丢失任何工作,请尝试以下操作:

rm tests/unit/src/models/BrandTests.js
git checkout -- tests/unit/src/models/BrandTests.js

这应该重置任何使它认为已经发生更改的机制。如果不起作用,可能还有其他方法。


谢谢你的建议Trev!我尝试了,但不幸的是它仍然显示相同的错误。太奇怪了... - Mark Stickley
我也遇到过这个问题,但似乎 git stash 不会将文件视为已修改。我手动备份了它,检出并手动比较了更改。肯定有更好的方法... - Paul Lammertsma
@PaulLammertsma 别忘了,stash 只是另一个提交,并且有自己的哈希值。您可以像操作其他提交一样对其进行操作。这留下了许多其他选项。我只是发现上述方法最快。 - Trevor Norris
@TrevNorris 这很奇怪;一切都提交得很好。但必须删除文件,重新检查并回复更改才能解决问题。 - Paul Lammertsma

1
我猜这是你的情况:
$ git checkout ProductsAndContents
Switched to branch 'ProductsAndContents'

分支ProductsAndContents包含文件tests/unit/src/models/BrandTests.js,因此上述checkout将创建它并/或确保其与请求的特定提交保持最新。

$ git status
# On branch ProductsAndContents
nothing to commit (working directory clean)

你没有做任何更改,并开始使用干净的工作目录,所以这是一个好的状态。

$ git checkout master
Switched to branch 'master'

这将确保在工作目录中最新提交的master分支中包含的所有文件都是最新的。但是,它不会删除或更新未包含在master分支中或被忽略的文件。在这里,我假设由于某种原因,master分支目前不包括所涉及的文件。
$ git status
# On branch master
nothing to commit (working directory clean)

再次确认,您没有进行任何修改。在此未提及该文件作为未跟踪文件的事实可能意味着它被忽略了(无论是在 .gitignore 还是在 .git/info/exclude 中)。master 不包含该文件,因此不关心它是否存在。

$ git merge ProductsAndContents
error: Your local changes to the following files would be overwritten by merge:
    tests/unit/src/models/BrandTests.js
Please, commit your changes or stash them before you can merge.
Aborting

这里,您试图合并其他分支时想要引入一个文件,但当前的master没有该文件,这通常是可以的。然而,该文件存在于您的工作目录中,git不希望删除它不确定是否保存在仓库中的内容。如其他地方建议的那样,您可以(假设您知道是安全的)简单地删除该文件并重新尝试合并。
根据您提供的信息,我不能100%确定您所描述的情况;您可以运行这两个命令来检查该条件:
git ls-files master -- tests/unit/src/models/BrandTests.js
git ls-files ProductsAndContents -- tests/unit/src/models/BrandTests.js

如果我猜得没错的话,第一条命令将不会显示文件存在,而第二条将会显示。然后检查.gitignore.git/info/exclude以查看它是否被忽略(对于.gitignore,您可能需要检查存在于两个分支中的版本)。

谢谢!不幸的是,该文件在两个分支中都存在,而不是在.gitignore或.git/info/exclude中。以下是输出:$ git ls-files master -- tests/unit/src/models/BrandTests.js tests/unit/src/models/BrandTests.js $ git ls-files ProductsAndContents -- tests/unit/src/models/BrandTests.js tests/unit/src/models/BrandTests.js - Mark Stickley

-2

仅因为每个分支没有要提交的内容并不意味着它们是相同的。我会有兴趣使用查看这两个文件之间的差异。

git diff

您可以使用以下命令返回已提交到存储库的修订版本:

git checkout -- tests/unit/src/models/BrandTests.js

3
请先提交您的更改或将其存储,然后才能合并。这意味着存在未提交的更改,而不是在分支之间已经提交的差异。 - Jonathan Wakely
没有需要提交的更改,也没有未跟踪的文件。正如我所提到的,diff命令没有任何输出。我感到困惑。 - Mark Stickley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接