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

时间:2013-04-01 14:11:34

标签: git

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

  

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

     

可湿性粉剂内容/ W3TC-配置/ master.php

     

请提交您的更改或存储它们,然后才能合并。

所以我跑了,

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

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

有什么想法吗?

18 个答案:

答案 0 :(得分:1090)

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

您有三种选择:

  • 使用

    提交更改
    git commit -m "My message"
    
  • 藏匿它。

    Stashing充当堆栈,您可以在其中推送更改,然后以相反的顺序弹出它们。

    要隐藏,请键入

    git stash
    

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

    git stash pop
    
  • 放弃本地更改

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

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

    使用git checkout filename

答案 1 :(得分:59)

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

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

第二个命令切换分支。

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

答案 2 :(得分:21)

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

底垫

对于简单的更改,在拉动更改时尝试在其上面进行重新定位,例如

git pull origin master -r

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

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

  

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

结帐

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

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

重置

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

git reset HEAD --hard

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

相关:How do I force "git pull" to overwrite local files?

答案 3 :(得分:12)

所以我遇到的情况如下:

  

错误:合并后将覆盖对以下文件的本地更改:   的wp-content / W3TC-配置/ master.php   请在合并之前提交更改或存储更改。

除了之前,它是远程的: 实际上是这样的:

  

remote:error:合并后将覆盖对以下文件的本地更改:   一些/ file.ext   请在合并之前提交更改或存储更改。

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

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

答案 4 :(得分:8)

试试这个

git stash save ""

然后再次尝试拉

答案 5 :(得分:3)

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

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

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强制其运行。

答案 6 :(得分:3)

这解决了我的错误:

我在分支机构:“ A”

git stash

移至主分支:

git checkout master
git pull

返回我的分支:“ A”

git checkout A
git stash pop

答案 7 :(得分:3)

这对我来说很有效:

git reset --hard

然后

git pull origin <*current branch>

之后

git checkout <*branch>

答案 8 :(得分:2)

在拉前要求提交

  • git stash
  • git pull起源<<分支名称>>

如果需要:

  • git隐藏应用

答案 9 :(得分:0)

在使用 reset 之前,请考虑使用 revert,这样您就可以随时返回。

https://www.pixelstech.net/article/1549115148-git-reset-vs-git-revert

应要求

来源:https://www.pixelstech.net/article/1549115148-git-reset-vs-git-revert

git reset vs git revert sonic0002 2019-02-02 08:26:39

当使用git等版本控制系统维护代码时,我们不可避免地需要回滚一些由于错误或临时代码恢复而导致的错误提交。在这种情况下,新手开发人员会非常紧张,因为他们可能会迷失在不影响他人的情况下回滚他们的更改应该做的事情,但对于资深开发人员来说,这是他们的日常工作,他们可以向您展示不同的方法来做到这一点。 在这篇文章中,我们将介绍开发者经常使用的两大类。

  • git 重置
  • git 恢复

它们的区别和对应的用例是什么?我们将在下面详细讨论它们。 重置 假设我们有以下几个提交。 enter image description here

提交 A 和 B 是工作提交,但提交 C 和 D 是错误提交。现在我们要回滚到提交 B 并删除提交 C 和 D。目前 HEAD 指向提交 D 5lk4er,我们只需要将 HEAD 指向提交 B a0fvf8 即可实现我们想要的。 使用 git reset 命令很容易。

git reset --hard a0fvf8

执行上述命令后,HEAD 将指向 commit B。 enter image description here

但是现在远程origin还是有HEAD指向commit D,如果我们直接用git push推送修改,不会更新远程repo,需要加一个 -f 选项强制推送更改。

git push -f

这种方法的缺点是一旦重置完成,HEAD 之后的所有提交都会消失。万一有一天我们发现一些提交吃了好东西并想保留它们,那就太晚了。正因为如此,许多公司禁止使用这种方法来回滚更改。

git 还原 git revert 的用途是创建一个新的提交来恢复之前的提交。 HEAD 将指向新的恢复提交。 对于上面的 git reset 示例,我们需要做的只是还原提交 D,然后还原提交 C。

git revert 5lk4er
git revert 76sdeb

现在它创建了两个新的提交 D' 和 C', enter image description here

在上面的例子中,我们只有两个提交要还原,所以我们可以一一还原。但是如果有很多提交要还原呢?我们确实可以还原一个范围。

git revert OLDER_COMMIT^..NEWER_COMMIT

这种方法没有git reset的缺点,它会将HEAD指向新创建的恢复提交,并且可以直接将更改推送到远程而不使用-f< /strong> 选项。 现在让我们看一个更困难的例子。假设我们有三个提交,但错误的提交是第二个提交。 enter image description here

使用 git reset 回滚提交 B 不是一个好主意,因为我们需要保留提交 C,因为它是一个好的提交。现在我们可以恢复提交 C 和 B,然后使用 cherry-pick 再次提交 C。 enter image description here

从上面的解释,我们可以发现git reset和git revert最大的区别在于git reset会将分支的状态重置为之前的状态通过删除所需提交后的所有更改,而 git revert 将通过创建新的恢复提交并保留原始提交来重置为以前的状态。建议在企业环境中使用 git revert 而不是 git reset 。 参考:https://kknews.cc/news/4najez2.html

答案 10 :(得分:0)

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

答案 11 :(得分:0)

可能

git --rebase --autostash

将提供帮助

答案 12 :(得分:0)

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

enter image description here

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

enter image description here

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

使用Working directory选择行,导航至 Diff 标签,然后用铅笔(或+或{{1 }})图标上,选择 重置为首次提交 ,或者提交或隐藏或您要对其进行任何操作。

答案 13 :(得分:0)

对我来说,此方法最有效,而不是隐藏。我想引入最新更改,并保留我的本地更改的副本,然后再应用。

  1. 进行本地更改。 (不提交)(还需要进行阶段性以修补新的未跟踪文件)

git add .

  1. 创建补丁以保持记录

git diff --cached > mypatch.patch

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

git reset --hard

  1. 拉动更改

git pull

  1. 应用补丁

git apply mypatch.patch

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

享受功能的持续工作,完成后进行本地更改。

答案 14 :(得分:0)

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

因为没有什么可提交的,所以不能选择提交。

无法隐藏存储,因为没有可存储的东西。

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

答案 15 :(得分:0)

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

,错误消息终于消失了:

1:git add .

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

3:git checkout the-other-file-name

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

答案 16 :(得分:0)

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

请参阅:Why should I use core.autocrlf=true in Git?

使用此按钮强制执行更新:

git pull origin master
git checkout origin/master -f

答案 17 :(得分:0)

在我的情况下,我备份然后删除了Git抱怨,提交的文件,然后我终于检查了另一个分支。

然后我替换了文件,复制回内容并继续,好像什么也没发生。