如何解决git所说的“提交更改或在合并之前将其隐藏”?


761

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

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

wp-content / w3tc-config / master.php

请先提交您的更改或将其存储在合并之前。

所以我跑了

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

并再次尝试,我得到相同的消息。我假设这w3tc改变了服务器上的配置文件中的某些内容。我不在乎本地副本还是远程副本在服务器上(我想远程副本最好),我只想能够合并其余的更改(插件更新)。

有任何想法吗?



11
这是一个更明确的问题,具有更多细节和更好的答案。我认为保持这一状态很有价值。是的,首先从技术上询问了另一个,但是删除此一个将使人们更加难以找到他们想要的答案。
Jo Sprague

Answers:


1298

您无法与本地修改合并。Git保护您避免丢失潜在的重要更改。

您有三种选择:

  • 使用提交更改

    git commit -m "My message"
    
  • 藏起来

    存放是一个堆栈,您可以在其中推送更改,然后以相反的顺序弹出更改。

    要隐藏,请键入

    git stash
    

    进行合并,然后拉出藏匿处:

    git stash pop
    
  • 放弃本地更改

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

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

    使用 git checkout filename


104
您还可以通过执行以下操作来丢弃特定文件的本地更改:git checkout filename
ckb

6
谢谢。我要补充的是,如果您愿意,git reset --hard您可能还想删除git clean -dfx
Jo Sprague 2013年

13
默认情况下,git stash不会隐藏没有历史记录的文件。因此,如果您有尚未添​​加的文件,但是将被合并覆盖或“创建”,则合并仍将阻止。在这种情况下,您也可以git stash -u用来隐藏未提交的文件。或者您可以删除它们!
joeytwiddle 2014年

25
跑步git clean -dfx是一个可怕的主意。删除了一些我实际上需要的.gitignored文件。
ezuk 2014年

5
我遇到过这样的情况,用户在完成操作后git reset --hard仍然有未合并的更改!
Amedee Van Gasse 2015年

83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

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

第二条命令切换分支。

第三个命令将还原您存储在存储中的更改(该--index选项对确保已暂存的文件很有用)。



2
解释@vikramvi的观点:我们也可以使用git stash pop代替git stash apply。前者将其从储藏库中移除,而后者仍将其保留在此处
Anupam

27

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

重新设定

对于简单的更改,请尝试在更改的基础上重新进行更改,例如

git pull origin master -r

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

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

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


查看

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

git checkout origin/master -f
git checkout master -f

重启

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

git reset HEAD --hard

如果上述方法无济于事,则可能是您的git规范化文件(.gitattributes)中的规则,因此最好提交上面的内容。或者您的文件系统不支持权限,因此您必须filemode在git config中禁用它。

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


1
不起作用:我仍然收到相同的消息,例如“先保存更改”。当我键入“ git stash”,然后输入“ git pull”->“错误:您有未保存的更改..首先进行存储”。在销毁我的计算机之
前不久

@ trinity420可能是您的文件权限,请保存git status后检查您进行了哪些更改。如果没有答案有帮助,请考虑添加一个新问题。
kenorb

谢谢你,但我的问题解决了,试穿了这里的一切,没有什么工作,然后点击“提交修改”,在PHPStorm“合并”,然后我unstashed的变化和它的工作..
trinity420


13

因此,我遇到的情况如下:

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

除了,在那之前是遥远的:所以实际上这是:

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

发生的事情是(我认为不是100%积极)git post接收挂钩开始运行并由于远程服务器存储库中的移动更改而搞砸了,从理论上讲,这不应该被触及。

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


2
是问题还是答案?
stdcall

2
@stdcall-两者都有。当我遇到问题中所述的情况时,这是我必须采取的解决措施。绝对不是正常的git解决方案,从这个问题出发,似乎好像是同一异常情况(即服务器上的配置更改,但本地没有更改)。如果有人对这发生的原因(或发生方式)有更多的了解,我将欢迎您提出任何见解。
Mike

7

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

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

Git 2.11及更高版本:

git clean  -d  -fx .

旧版Git:

git clean  -d  -fx ""

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

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

  • -d表示除了删除未跟踪的文件之外,还删除未跟踪的目录。

  • 需要-f来强制它运行。


4

解决此问题时要保留新创建文件的记录:

如果您有新创建的文件,则可以创建本地更改的补丁程序,拉入远程合并,并在远程合并完成后应用本地补丁程序,如下面逐步定义的那样:

  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不适用有关此问题的详细讨论

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


我想推送包含新更改的部分代码,所以我做了:1.从本地dev分支中创建了补丁2.进行了硬重置3.将新更改从master移到dev(以避免任何合并冲突)4 。对我的本地开发人员进行了小小的更改5.推送到了远程开发人员6.已应用的修补程序返回->得到错误:error: patch failed: yourfile.py:33 error: yourfile.py: patch does not apply,我仍然拥有mypatch.patch,但不知道为什么它没有被应用并且丢失了更改!
阿努

我知道了,正确的命令是git apply --reject --whitespace=fix mypatch.patch,我把修改发回来了!!![感谢](stackoverflow.com/a/15375869/6484358
Anu

1
Anu,命令git apply mypatch.patch是正确的应用补丁程序,这是我一直使用的,创建的补丁程序本身可能存在一些问题,如果您手头有补丁程序,则永远不会丢失更改,它包含所有合并的更改。
Manpreet

2

拉前要求提交

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

如果需要的话 :

  • git stash适用

1
当您想记录工作目录和索引的当前状态,但又想回到干净的工作目录时,请使用git stash。该命令将您的本地修改保存下来,并还原工作目录以匹配HEAD提交。
Pushpak Sharma

2

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

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

不能选择隐藏,因为没有东西可以隐藏。

像它看起来可能是从排除的文件中.git/info/exclude并具有git update-index --assume-unchanged <file>“编一些文件。


0

就我而言,我先备份然后删除了Git抱怨的文件,然后提交,然后我终于可以签出另一个分支。

然后,我替换了文件,将其复制回目录,然后继续进行,好像什么都没发生。



0

我尝试了第一个答案:git stash得分最高,但仍然弹出错误消息,然后我发现本文提交了更改,而不是隐藏“不愿意提交”

错误消息最终消失了:

1: git add .

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

3: git checkout the-other-file-name

然后它起作用了。希望这个答案有帮助。:)


0

如果您使用的是Git扩展程序,则应该可以在中找到本地更改,Working directory如下所示:

在此处输入图片说明

如果看不到任何更改,则可能是因为您使用了错误的子模块。因此,请检查所有带有潜艇图标的物品,如下所示:

在此处输入图片说明

当您发现一些未提交的更改时:

选择带有的行Working directory,导航至“ 差异”选项卡,右键单击带有铅笔(或+-)图标的行,选择“ 重置为首次提交或提交或隐藏”,或使用它进行任何操作。


0

对我来说,这工作:

git reset --hard

然后

git pull origin <*current branch>

之后

git checkout <*branch>


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.