如何解决git说“提交您的更改或在您可以合并之前隐藏它们”?

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

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

所以我跑了,

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

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

有什么想法吗?

1753656 次浏览

您不能与本地修改合并。Git可以防止您丢失潜在的重要更改。

你有三个选择:

  • 提交更改

    git commit -m "My message"
  • Stash it.

    Stashing acts as a stack, where you can push changes, and you pop them in reverse order.

    To stash, type

    git stash

    执行合并,然后拉取stash:

    git stash pop
  • Discard the local changes

    using git reset --hard
    or git checkout -t -f remote/branch

    Or: Discard local changes for a specific file

    using git checkout filename

所以我遇到的情况如下:

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

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

远程:错误:您对以下文件的本地更改将被合并覆盖:一些/file.ext请在合并之前提交更改或隐藏它们。

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

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

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

第一个命令将您的更改临时存储在的藏匿中并从工作目录中删除它们。

第二个命令切换分支。

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

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

rebase

对于简单的更改,尝试在拉取更改时重新基于它,例如。

git pull origin master -r

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

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

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


结帐

如果你不关心你的本地变化,你可以临时切换到其他分支(强制),然后切换回来,例如。

git checkout origin/master -fgit checkout master -f

重置

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

git reset HEAD --hard

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

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

试试这个

git stash save ""

再拉一次试试

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

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

在拉取之前要求提交

  • git stash
  • git拉取来源<<分支名称>>

如有需要:

  • git stash应用

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

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

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需要强制它运行。

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

见:为什么要在Git中使用core.autocrlf=true?

使用它来拉取和强制更新:

git pull origin mastergit checkout origin/master -f

我尝试了第一个答案:git stash,得分最高,但错误消息仍然弹出,然后我找到了这篇文章来提交更改而不是stash不情愿的承诺

错误消息终于消失了:

1:git add .

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

3:git checkout the-other-file-name

希望这个答案对你有帮助:)

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

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

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

看起来它可能来自.git/info/exclude中的排除文件并具有git update-index --assume-unchanged <file>'ed一些文件。

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

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

  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:补丁不适用详细谈到了这个问题

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

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

在此处输入图片描述

如果你没有看到任何变化,可能是因为你在错误的子模块上。所以用潜艇图标检查所有项目,如下所示:

在此处输入图片描述

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

选择Working directory行,导航到Diff选项卡,右键单击带有铅笔(或+-)图标的行,选择重置到第一次提交或提交或存储或任何您想用它做的事情。

对我来说,这奏效了:

git reset --hard

然后

git pull origin <*current branch>

之后

git checkout <*branch>

大概吧

git --rebase --autostash

将有助于

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

这解决了我的错误:

我在分支上:“A”

git stash

移动到主分支:

git checkout mastergit pull*

移回我的分支:“A”

git checkout Agit stash pop*

在使用重置之前,请考虑使用恢复,这样您就可以随时返回。

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

应要求

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

git重置与git恢复  2019-02-02 08:26:39

在使用git等版本控制系统进行代码维护的时候,难免会有因为bug或者临时代码恢复导致的代码提交错误,需要进行回滚。这种情况下,新手会很紧张,因为他们可能不知道如何在不影响他人的情况下回滚自己的修改,但是对于资深开发者来说,这是他们的日常工作,他们会告诉你不同的方法。在这篇文章中,我们将介绍开发人员经常使用的两个主要方法。

  • git重置
  • git恢复

它们的区别和对应的用例是什么?我们会在下面详细讨论。git重置假设我们有以下几个提交。输入图片描述

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

git reset --hard a0fvf8

执行上述命令后,HEAD将指向提交B。输入图片描述

但是现在远程源仍然有HEAD点提交D,如果我们直接使用git推送推送更改,它不会更新远程仓库,我们需要添加一个-f选项来强制推送更改。

git push -f

这种方法的缺点是重置之后HEAD下的代码会全部消失。如果哪天发现提交的代码做的不错想保留下来就太迟了。也正因为如此很多公司不允许用这种方法做回滚修改。

从git恢复开始git恢复的用途是创建一个恢复前一个提交的新提交。HEAD将指向新的恢复提交。 对于上面的git重置示例,我们需要做的只是恢复提交D,然后恢复提交C。

git revert 5lk4ergit revert 76sdeb

现在它创建了两个新的提交D'和C', 输入图片描述

在上面的例子中,我们只有两个提交要恢复,所以我们可以一个接一个地恢复。但是如果有很多提交要恢复怎么办?我们确实可以恢复一个范围。

git revert OLDER_COMMIT^..NEWER_COMMIT

此方法不会有git重置的缺点,它会将HEAD指向新创建的还原提交,并且可以直接将更改推送到远程而不使用-f选项。现在让我们看一个更难的例子。假设我们有三个提交,但坏的提交是第二个提交。 输入图片描述

使用git重置回滚提交B不是一个好主意,因为我们需要保留提交C,因为它是一个好的提交。现在我们可以恢复提交C和B,然后使用樱桃采摘再次提交C。 输入图片描述

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

%git状态头在5c分离未为提交暂存的更改:(使用“git add…”更新将要提交的内容)(使用“git恢复…”丢弃工作目录中的更改)

使用:

git重置

然后:

git拉取原始主机

我在NestJS项目中遇到了.env文件的类似问题。

尝试了许多方法,包括本页上的方法。

最后,在剪贴板上复制.env的内容,删除文件,git pull工作!

重新创建.env并将内容粘贴回。

如果有多个文件,只需将它们暂时移出git repo目录,并在拉取更改后将它们移回。

如果只有一个文件在本地更新,并且您想放弃该文件中的更改,那么您可以执行以下操作——

// Pull latest activities-page.tsx from remote and discard local changes.git checkout activities-page.tsx//Pull latest branchgit pull origin master