【问题标题】:Your local changes to the following files would be overwritten by merge您对以下文件的本地更改将被合并覆盖
【发布时间】:2016-01-27 08:58:44
【问题描述】:

这里有人问过类似的问题,但我相信这个特定的问题没有。

我有一个文件params.dat,它为我的代码存储了一些参数值。

这个文件是不断变化的,因为我经常改变参数值,所以我把它的静态版本和其他代码一起添加到我的仓库中,然后忽略它:

git update-index --assume-unchanged params.dat

一切正常,除非我必须对文件的静态版本进行一些更改(这种情况并不经常发生)。我要做的是,首先取消忽略它:

git update-index --no-assume-unchanged params.dat

然后进行必要的更改,提交并推送到 Github,最后再次忽略该文件。

这与我的主存储库完美配合,但是当我尝试从我继续工作的存储库中 git pull 时,我得到:

error: Your local changes to the following files would be overwritten by merge:
    params.dat
Please, commit your changes or stash them before you can merge.
Aborting

按照here 的解释,我尝试过这样做:

git fetch --all
git reset --hard origin/master

但我明白了:

error: Entry 'params.dat' not uptodate. Cannot merge.
fatal: Could not reset index file to revision 'origin/master'.

我也试过了:

git stash
git merge origin/master
git stash pop

here 所述,但在git stash 之后我得到:

No hay cambios locales que guardar

(大致翻译为“没有要保存的本地更改”)

为了清楚起见:我对在我的工作中保存的 repo 中的 params.dat 文件上保留 任何 更改不感兴趣。我只是希望它是我上次从家里推送到 Github 的任何内容的精确副本。

处理这个问题的适当方法是什么?

【问题讨论】:

标签: git


【解决方案1】:

在这种情况下,“没有要保存的本地更改”意味着 git stash 没有看到 params.dat 中的本地更改,因为它被假定为未更改。

在拉取之前,您必须使本地更改可见,并在params.dat 文件中删除它们(如果有):

$ git update-index --no-assume-unchanged params.dat
$ git checkout -- params.dat
$ git pull
$ git update-index --assume-unchanged params.dat

如果您感兴趣的其他文件中存在未提交的本地更改,请使用 stash 保留它们并在拉取后恢复:

$ git update-index --no-assume-unchanged params.dat
$ git checkout -- params.dat
$ git stash
$ git pull
$ git stash pop
$ git update-index --assume-unchanged params.dat

【讨论】:

  • 这不会保留对params.dat 的更改吗? OP 说他不想“在params.dat 上保留任何 更改”。
  • @wspurgin 嗯...我在问题中看到git stash pop,所以添加它...让我重新阅读它)
  • 可能是git update-index --no-assume-unchanged params.dat 然后是git checkout params.data?然后拉取并更新索引?
  • @wspurgin 完全正确!感谢您指出这一点...我错过了他对本地更改不感兴趣...所以不需要藏在那里。
  • @Gabriel 不客气!此外,如果您有新的本地(尚未推送)提交,则在您的情况下使用 git pull --rebase 而不是 git pull 可能会很方便。它将基于从上游拉取的提交,而不是创建合并提交。
【解决方案2】:

我尝试了上述所有步骤,但对我不起作用。

在线数小时后,我发现您可以在某个地方使用rename that file,然后执行您的pullresetrebase

这将为您提取远程文件(重新创建重命名的文件)。

现在您可以删除renamed file,然后生活继续。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-25
    • 2015-10-01
    • 2015-12-03
    • 2016-03-30
    • 2014-04-20
    • 2021-04-24
    • 2012-03-24
    • 2014-10-03
    相关资源
    最近更新 更多