如何忽略在'git pull'中关于本地更改将被合并覆盖的错误?

883

如何忽略 Git pull 中出现的以下错误消息?

以下文件的本地更改将被合并覆盖

如果我想要重写它们怎么办?

我尝试了像 git pull -f 这样的方法,但都没有起作用。

需要明确的是,我只想覆盖特定的更改,而不是所有的更改。


相关但不重复:https://dev59.com/IXVD5IYBdhLWcg3wNIzc - Daniel Hilgarth
12
完全同意!而且,如果只是“覆盖”,这也算不上真正的“合并”,对吧?我每天都在怀念 SVN... - user1944491
6
git config core.fileMode false 的意思是“关闭 Git 对文件模式的检查”,这将节省我的时间。 - Nolwennig
8
可能是重复的问题,与“如何解决git提示'在合并之前提交你的更改或隐藏它们'?”相同。 - TylerH
如果我不想覆盖它们怎么办? - Philip Rego
39个回答

22

试一试

git fetch --all 

git reset --hard origin/master

git pull origin master

强制拉取对我来说可行


小心,这样做会丢失所有本地更改! - Eugen Konkov

15

git stash save --keep-index 对我无效。

以下命令按预期工作。

git reset --hard
git pull

如果您不需要本地更改,它会覆盖所有本地更改。


12

在最近的Git中,你可以在pull命令中添加-r/--rebase选项,以便在获取远程分支之后将当前分支变基于上游分支。这样应该能够消除警告,但有一定的风险会出现一些冲突需要解决。


或者你可以强制检出不同的分支,然后再回到master分支,例如:

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

然后像往常一样再拉一次:

git pull origin master

使用这种方法可以节省时间,避免了stash(git stash)和潜在的权限问题,重置文件(git reset HEAD --hard),删除文件(git clean -fd)等操作。此外,上述操作更容易记忆。


11
这个问题是由于你本地对文件/文件夹进行了更改,而在Git仓库中同样的文件/文件夹也发生了更改,所以在pull/push之前需要将本地更改存储起来:
要覆盖单个文件的本地更改:
git reset file/to/overwrite
git checkout file/to/overwrite

要覆盖本地所有更改(所有文件中的更改):

git stash
git pull
git stash pop

此问题可能是因为您正在使用未与主分支合并的分支。

10

这是我解决问题的策略。

问题陈述

我们需要更改10多个文件。我们尝试使用PULL(git pull origin master),但Git报错:

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

我们试图先执行commit然后再pull,但它们也不起作用。

解决方案

实际上,我们处于"脏"阶段,因为这些文件处于“暂存区”(即“索引区”),有些文件处于“工作区”(即“本地Git目录”),而我们想要从服务器上拉取更改。

请访问此链接了解Git的不同阶段的信息:GIT阶段

我们按照以下步骤操作

  • git stash(这使得我们的工作目录变得干净。您的更改由Git存储在堆栈中)。
  • git pull origin master(从服务器上拉取更改)
  • git stash apply(将堆栈中的所有更改应用)
  • git commit -m 'message'(提交更改)
  • git push origin master(将更改推送到服务器)
  • git stash drop(删除堆栈)

让我们了解何时以及为什么需要存储

如果您的工作目录处于 状态,这意味着您正在修改文件并且由于任何原因,被迫拉取切换 到另一个分支进行一些非常紧急的工作,那么此时您不能在提交更改之前就进行拉取或切换。这就是 stash 命令的用处。

来自书籍《ProGIT》,第二版:

通常情况下,当您在项目的某个部分工作时,事情变得混乱不堪,并且您想暂时切换到其他分支进行工作。但问题是,您不想为了能够稍后回到此点而提交未完成的工作。解决这个问题的方法是使用 git stash 命令。Stash 命令会将您的工作目录的 状态(即修改过的跟踪文件和已暂存的更改)保存到一个未完成更改的堆栈中,您可以随时重新应用它们。


尽管git没有显示任何本地更改,但在合并之前仅使用“git stash”有所帮助。 - Rahul Rastogi

10

git reset --hard && git clean -df

注意:这将重置并删除任何未被跟踪的文件。


44
不应该用斧头从朋友额头上除掉苍蝇。 - HonoredMule
5
不经意间使用此功能可能会删除某些文件,请注意。 - andromeda

7

我用以下方法成功地在远程服务器上放弃更改并从源代码控制GitHub中获取:

git reset --hard
git pull origin master

6
解决这个问题的最佳方式是:
git checkout -- <path/file_name>

然后,您可以通过以下方式覆盖该文件:

git pull origin master

我遇到了上述问题,因为我更新了索引以假定文件未更改。它仍然不允许我执行pull操作。我只使用了一次 git checkout -- path/*,然后就可以执行pull操作了。 - Stephen O'Flynn

6
您可以使用此功能进行文件覆盖。
git checkout file_to_overwrite

6

如果你想在服务器上保留生产更改,只需将其合并到新的配置项中。处理方法如下:

git stash
git pull
git stash pop

也许您不需要执行所有操作,您可以知道下一步该做什么。

1
您可以使用Git diff -w +文件名来确认代码合并是否自动完成。 - YanQing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接