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

Jo *_*gue 678 git

我在我的本地计算机上做了一些更新,将它们推送到远程存储库,现在我正在尝试将更改提取到服务器并获取消息;

错误:合并将覆盖对以下文件的本地更改:

的wp-content/W3TC-配置/ master.php

请在合并之前提交更改或存储更改.

所以我跑了,

git checkout -- wp-content/w3tc-config/master.php
Run Code Online (Sandbox Code Playgroud)

并再次尝试,我收到相同的消息.我假设w3tc在服务器上的配置文件中改变了一些东西.我不关心本地副本或远程副本是否在服务器上(我认为远程副本是最好的),我只是希望能够合并其余的更改(插件更新).

有任何想法吗?

std*_*all 1180

您无法与本地修改合并.Git可以保护您免于丢失潜在的重要更改.

你有三个选择:

  • 您还可以通过执行以下操作来丢弃特定文件的本地更改:git checkout filename (97认同)
  • 运行`git clean -dfx`是个糟糕的主意.删除了我实际需要的一些.gitignored文件. (24认同)
  • 默认情况下,`git stash`不会存储没有历史记录的文件.因此,如果您有尚未添​​加但将被合并覆盖或"创建"的文件,则合并仍将阻止.在这种情况下,您也可以使用`git stash -u`来存储未提交的文件.或者你可以删除它们! (12认同)
  • 谢谢.我想补充一点,如果你做`git reset --hard`你可能还想用`git clean -dfx删除未跟踪的文件 (5认同)
  • 我遇到过一种情况,用户在执行```git reset --hard```之后仍然有未更改的更改! (5认同)
  • 使用 `git checkout filename` 放弃特定文件的本地更改 (4认同)
  • 只是一个注释。我遇到了 .gitignore 与源不同步的问题。我一直在使用 `git update-index --assume-unchanged C:\...\.gitignore` 我必须更改它以再次跟踪更改,这样我就可以使用 `git stash` ,如下所示: `git update-index - -no-assume-unchanged C:\...\.gitignore` 那么上面的效果很好! (2认同)

Log*_*han 68

git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index
Run Code Online (Sandbox Code Playgroud)

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

第二个命令切换分支.

第三个命令恢复存储在存储中的更改(该--index选项对于确保暂存的文件仍处于暂存状态非常有用).

  • 解释@vikramvi 的观点:我们还可以使用 `git stash pop` 而不是 `git stash apply`。前者将其从隐藏中删除,而后者仍将其保留在那里 (5认同)

小智 32

使用 :

git重置——硬

然后 :

git pull origin 大师


ken*_*orb 22

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

变基

对于简单的更改,尝试在拉动变化的同时进行变基,例如

git pull origin master -r
Run Code Online (Sandbox Code Playgroud)

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

这相当于:checkout master,fetchrebase origin/masterGit命令.

这是一种潜在危险的操作模式.它重写了历史,当你已经发布了这段历史时,它并不是一个好兆头.除非您git-rebase(1)仔细阅读,否则请勿使用此选项.


查看

如果您不关心本地更改,可以切换到其他分支临时(强制),然后将其切换回来,例如

git checkout origin/master -f
git checkout master -f
Run Code Online (Sandbox Code Playgroud)

重启

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

git reset HEAD --hard
Run Code Online (Sandbox Code Playgroud)

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

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

  • 不起作用:我仍然收到相同的消息,例如“先存储您的更改”。当我输入“git stash”然后输入“git pull”-&gt;“错误:您有未保存的更改..先进行存储”。在摧毁我的电脑之前不久 (2认同)

Dip*_*ick 18

这解决了我的错误:

我在分支:“A”

git stash
Run Code Online (Sandbox Code Playgroud)

移动到主分支:

git checkout master 
git pull*
Run Code Online (Sandbox Code Playgroud)

移回我的分支:“A”

git checkout A 
git stash pop*
Run Code Online (Sandbox Code Playgroud)


Mik*_*ike 12

所以我遇到的情况如下:

错误:对以下文件的本地更改将被合并覆盖:wp-content/w3tc-config/master.php请在合并之前提交更改或存储它们.

除了之前,它是远程的:所以实际上这个:

remote:错误:对以下文件的本地更改将被merge覆盖:some/file.ext请在提交之前提交更改或存储它们,然后才能合并.

发生的事情是(我认为,不是百分之百正面)git post接收钩子开始运行并且由于远程服务器存储库中的移动变化而搞砸了,理论上,这不应该被触及.

所以我最后通过跟踪post-receive钩子找到了这个,不得不去服务器上的远程存储库,并且有更改(这不在我的本地存储库,实际上,说它匹配,没有变化,没有任何提交,最新,等等.)所以在本地,没有变化,在服务器上,我然后做了一个git checkout -- some/file.ext然后本地和远程存储库实际匹配,我可以继续工作,并部署.不完全确定这种情况是如何发生的,尽管有几十个开发人员加上IT变更可能与它有关.

  • 这是一个问题还是一个答案? (2认同)
  • @stdcall-两者都有。当我遇到问题中所述的情况时,这就是我必须要做的解决。绝对不是正常的git解决方案,从问题上看,好像是同一异常情况(即服务器上的配置更改,但本地没有更改)。如果有人对为什么发生(或如何发生)有更多的想法,我将欢迎您提出任何见解。 (2认同)

小智 11

试试这个

git stash save ""
Run Code Online (Sandbox Code Playgroud)

再试一次拉

  • 就我而言,我需要使用`git stash -u`,如/sf/ask/1102153181/所述-他们在你可以我之前#comment34028978_15745424 (3认同)

Dar*_*ter 9

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

就我而言,我不想保留文件,所以这对我有用:

Git 2.11 及更新版本:

git clean  -d  -fx .
Run Code Online (Sandbox Code Playgroud)

旧版 Git:

git clean  -d  -fx ""
Run Code Online (Sandbox Code Playgroud)

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

  • -x 表示忽略的文件以及 git 未知的文件也将被删除。

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

  • -f 需要强制它运行。


Man*_*eet 6

要在解决此问题时记录新创建的文件,请执行以下操作:

如果您有新创建的文件,您可以创建一个本地更改补丁,拉入远程合并并在远程合并完成后应用本地补丁,如下所示:

  1. 暂存您的本地更改。(不要提交)。需要暂存来创建新创建的文件的补丁(因为它们仍未被跟踪)

git add .

  1. 创建一个补丁来保存记录

git diff --cached > mypatch.patch

  1. 放弃本地更改并删除新的本地文件

git reset --hard

  1. 拉动更改

git pull

  1. 应用您的补丁

git apply mypatch.patch

Git 将合并更改并为未合并的更改创建 .rej 文件。

按照 Anu 的建议,如果您在应用补丁时遇到问题,请尝试:

git apply --reject --whitespace=fix mypatch.patch 这个答案git: patch does not apply有关此问题的详细讨论

享受您对功能的持续工作,并在完成后提交本地更改。


Yes*_*shi 6

对我来说这有效:

git reset --hard

进而

git pull origin <*current branch>

在那之后

git checkout <*branch>


小智 6

使用放弃本地更改git reset --hard


Rah*_*kar 5

在拉取之前请求提交

  • git 存储
  • git pull origin <<分支名>>

如果需要的话 :

  • git 存储应用


Leo*_*Leo 5

对我来说,只是git reset --hard有效。

承诺不是一个选择,因为没有什么可以承诺的。

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

看起来它可能来自排除的文件.git/info/exclude并已经git update-index --assume-unchanged <file>编辑了一些文件。