如何解决git说“在合并之前提交更改或存储它们”?


How do I resolve git saying “Commit your changes or stash them before you can merge”?

我在本地机器上进行了一些更新,将它们推送到远程存储库,现在我正尝试将更改拉到服务器上,并获得消息;

error: Your local changes to the following files would be overwritten by merge:

wp-content/w3tc-config/master.php

Please, commit your changes or stash them before you can merge.

所以我跑了,

1
git checkout -- wp-content/w3tc-config/master.php

然后再试了一次,我得到了同样的信息。我假设w3tc更改了服务器上配置文件中的某些内容。我不在乎本地副本还是远程副本在服务器上运行(我认为远程副本最好),我只想能够合并其余的更改(插件更新)。

有什么想法吗?


不能与本地修改合并。Git保护您不丢失可能重要的更改。

您有三种选择:

  • 使用提交更改
    1
    git commit -m"My message"
  • 把它藏起来。

    存储充当一个堆栈,您可以在其中推送更改,并以相反的顺序弹出它们。

    隐藏,类型

    1
    git stash

    进行合并,然后拉出隐藏:

    1
    git stash pop
  • 放弃本地更改

    使用git reset --hard。或git checkout -t -f remote/branch

    或:放弃特定文件的本地更改

    使用git checkout filename


1
2
3
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

第一个命令将您的更改临时存储在stash中,并将其从工作目录中删除。

第二个命令切换分支。

第三个命令恢复存储在stash中的更改(--index选项可用于确保阶段文件仍处于阶段)。


您可以尝试以下方法之一:

重碱

对于简单的更改,尝试在其顶部重新定位,同时拖动更改,例如

1
git pull origin master -r

因此,它将在提取后将当前分支应用于上游分支的顶部。

这相当于:checkout masterfetchrebase origin/mastergit命令。

This is a potentially dangerous mode of operation. It rewrites history, which does not bode well when you published that history already. Do not use this option unless you have read git-rebase(1) carefully.

结帐

如果您不关心您的本地更改,您可以切换到其他临时分支(使用force),然后将其切换回,例如。

1
2
git checkout origin/master -f
git checkout master -f

重置

如果您不关心您的本地更改,请尝试将其重置为head(原始状态),例如

1
git reset HEAD --hard

如果上面没有帮助,那么可能是您的git规范化文件(.gitattributes中的规则,所以最好提交它所说的内容。或者您的文件系统不支持权限,所以您必须在git配置中禁用filemode

相关:如何强制"git pull"覆盖本地文件?


所以我遇到的情况是:

error: Your local changes to the following files would be overwritten by merge:
wp-content/w3tc-config/master.php
Please, commit your changes or stash them before you can merge.

但在那之前,是偏远的:所以实际上这是:

remote: error: Your local changes to the following files would be overwritten by merge:
some/file.ext
Please, commit your changes or stash them before you can merge.

发生的事情是(我认为不是100%正面的),由于远程服务器存储库中的移动变化,Git Post接收钩子开始运行并发生故障,从理论上讲,这是不应该触及的。

因此,我最终通过跟踪接收后挂钩发现这一点,不得不转到服务器上的远程存储库,并进行了更改(不在我的本地存储库中,事实上,该存储库说它匹配,没有更改,没有要提交的内容,最新的内容等),所以在本地服务器上,服务上没有更改。r,然后我做了一个git checkout -- some/file.ext,然后本地和远程存储库实际匹配,我可以继续工作和部署。不完全确定这种情况是如何发生的,尽管几十个开发人员加上IT变更可能与此有关。


试试这个

1
git stash save""

然后再拉一次


警告:这将删除未跟踪的文件,因此这不是这个问题的好答案。

在我的情况下,我不想保留这些文件,所以这对我很有用:

Git 2.11及更高版本:

1
git clean  -d  -fx .

老Git:

1
git clean  -d  -fx""

参考:http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -X表示忽略的文件也会被删除,以及Git不知道的文件。

  • -d意味着除了未跟踪的文件之外,还要删除未跟踪的目录。

  • -F必须强制运行。


在拉之前请求承诺

  • 暂存
  • git pull origin<>

如果需要的话:

  • Git StApple应用


对我来说,只有git reset --hard起作用。

提交不是一种选择,因为没有什么可提交的。

藏匿不是一种选择,因为没有什么可以藏匿的。

看起来它可能来自于.git/info/exclude中排除的文件,并且有git update-index --assume-unchanged 处理了一些文件。


我尝试了第一个答案:git stash,分数最高,但错误消息仍然出现,然后我发现这篇文章是为了提交更改而不是"勉强提交"。

最后错误信息消失了:

1:git add .

2:git commit -m"this is an additional commit"

3:git checkout the-other-file-name

然后成功了。希望这个答案有帮助。:)


这可能是由CRLF问题引起的。

看:我为什么要用core.autocrlf=true在git中?

使用此选项可拉取并强制更新:

1
2
git pull origin master
git checkout origin/master -f

在我的案例中,我备份并删除了Git抱怨的文件,提交了,然后我终于可以签出另一个分支。

然后我替换了文件,复制了内容,继续进行,就好像什么都没发生一样。