我如何忽略有关本地更改将被合并覆盖的“ git pull”错误?


567

如何忽略有关Git pull的以下错误消息?

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

如果我覆盖它们怎么办?

我已经尝试过类似的方法git pull -f,但没有任何效果。

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



7
@BrianKnoblauch完全同意!另外,如果它是“覆盖”,那不是什么“合并”?我每天都想念SVN ...
user1944491 2015年

2
git config core.fileMode false节省时间
Nolwennig '04


如果我不想覆盖它们怎么办?
菲利普·雷戈

Answers:


438

如果要从工作副本中删除所有本地更改(包括git未跟踪的文件),只需将它们存储起来:

git stash push --include-untracked

如果您不再需要它们,现在可以删除该存储:

git stash drop

如果您不想隐瞒已经上演的更改-例如使用git add-,则添加选项--keep-index。但是请注意,如果这些分阶段的更改与上游的更改发生冲突,这仍将阻止合并。


如果只想覆盖本地更改的特定部分,则有两种可能性:

  1. 提交所有您不想覆盖的内容,其余使用上面的方法。

  2. 使用git checkout path/to/file/to/revert您要覆盖更改。确保未通过暂存文件git reset HEAD path/to/file/to/revert


第2种情况不起作用。执行命令后,没有任何反应。在拉动时,我仍然遇到相同的错误。
2013年

1
@ user1132363:它对我有用。请先使用一个文件进行测试。另外,请确保未暂存要覆盖的文件。
Daniel Hilgarth

3
诀窍是使用git checkout HEAD^ path/to/file/to/revert。使用HEAD ^改变了一切。
2013年

2
@ user1132363:签出以前的版本,而不签出当前签入的版本。我不认为这是正确的方法。
Daniel Hilgarth 2013年

1
我不得不省略“ save --keep-index”。
彼得·莫滕森

318

在其他两个答案的帮助下,我提出了一个直接的解决方案:

git checkout HEAD^ file/to/overwrite
git pull

7
这对我有用。您能否扩展这个答案,即。这到底在做什么?
AC Patrice

3
它删除了本地更改,恢复为HEAD参考,这可能是master分支中的最后一个提交
k3a 2013年

32
为什么用HEAD ^而不是HEAD?
Yura

19
HEAD ^是HEAD ^ 1的缩写,从本质上讲意味着HEAD之前的一个提交。您也可以在提交之前执行HEAD ^ 2。有关更多信息,请参见git-scm.com/book/en/v2/…stackoverflow.com/questions/1955985/…
davidneedham

4
请解释答案中的作用
endolith

242

这适用于我覆盖所有本地更改,并且不需要身份:

git reset --hard
git pull

4
因此,SO需要根据他们的排名算法进行工作,这很麻烦,因此很难找到一个可行的,高度评价的答案。
Benedict K.

3
@BenedictK。我相信排名系统可以恰当地反映“大多数人认为最有用的东西”。他们以选票排名。更多的人喜欢其他解决方案。这是一个很好的解决方案,但是更多的人发现其他答案更有帮助。
Kittsil

对我来说效果很好
Ender

超级容易=)thx ^^
lestat_kim

坦克,对我来说很好
伊戈尔

76

这是一个解决方案,可消除分阶段进行的更改:

git reset file/to/overwrite
git checkout file/to/overwrite

11
令人讨厌的是,如果感知到的差异是由于检出时文件的换行符发生了更改,那么这将无法解决问题。
DanielSank 2014年

1
解决了我的问题。
卢瓦克N.

imo,这是最好的答案,因为它不会破坏任何已暂存的项目,但是可以解决防止拉文件的问题
theRiley

65

您可以在进行合并之前提交更改,也可以隐藏它们:

  1. git stash save
  2. git merge origin/master
  3. git stash pop

10
重点是,您不必这样做。只需获取当前的HEAD材质,然后将其合并即可!真的很简单,Git,所有其他VCS都可以做到……但不。Linus不得不烦人使用。
2016年

@Jon这个解决方案是针对Ubuntu的,我没有找到比这更好的了。
Suneel Kumar

不幸的是,该--autostash选项仅适用于--rebase选项(
Eugen Konkov

多数民众赞成在引入这么多问题是不值得的。至少还需要5分钟才能加载。还引入了“取消链接文件”错误。下注
菲利普·雷戈

51

如果要放弃对一个文件的本地更改,可以执行以下操作:

git checkout -- <file>

然后,您可以使用最新版本覆盖文件,只需执行以下操作:

git pull

@pabloasc这会破坏该文件中的本地更改。
Suneel Kumar

6
是的,它的确是:“如果我要覆盖它们怎么办?”
大卫,

1
原来的问题是无法做到这一点的,这个答案会给一个梦night以求的人可以盲目复制粘贴命令。
Suneel Kumar

如果您已经进行了提交,则首先必须通过还原提交git reset HEAD~,然后执行git checkout
dopexxx

git checkout -- <file>失败error: pathspec '<file>' did not match any file(s) known to git.
A__

18

如果您的存储库包含从master以下位置删除的一些文件:

  1. git checkout master
  2. git fetch origin
  3. git reset --hard origin/master
  4. git checkout -b newbranch

12

有时,这些都不起作用。烦人的是,由于我认为是LF,将删除文件然后再进行拉动将是可行的。并不是我建议您使用此解决方案,但是如果文件不存在,git不会毫无用处地通知您您所做的更改(甚至可能不是更改)将被覆盖,并让您继续。

使用风险自负。


当您由于行尾而卡住时,此方法可节省生命
Dan Pisarski

这对我不起作用。这些文件在本地不存在,并且仍然出现错误。
PRMan

11

git stash save --keep-index 没有为我工作。

下面的命令按预期工作。

git reset --hard
git pull

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


9

这里的答案太多了,我不想再添加一个,但是以上所有这些都比需要的要笨。我必须一直这样做,因为Git似乎很困惑,并说我修改了未更改的文件(无法恢复,因为它们没有更改,但是我无法拉出,因为它们应该已经更改了)。到目前为止,我发现最快的是:

git stash
git stash drop
git pull

像魅力一样运作
Blaze

惊人!简单有效的解决方案。
naïveRSA

辉煌,非常感谢
Hamza

8

在最新的Git中,您可以添加-r/ --rebaseon pull命令以在提取后将当前分支重新置于上游分支之上。警告应该消失了,但是有可能会遇到一些需要解决的冲突。


或者,您可以强制签出其他分支,然后master再次返回,例如:

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

然后像往常一样再次拉:

git pull origin master

使用此方法可以节省存储时间(git stash)和潜在的权限问题,重置文件(git reset HEAD --hard),删除文件(git clean -fd)等时间。此外,上面的内容更容易记住。


8

这个问题是因为您已经在本地对文件进行了更改,并且Git存储库中的更改存在相同的文件,因此在拉/推之前,您需要存储本地更改:

要覆盖单个文件的本地更改:

git reset file/to/overwrite
git checkout file/to/overwrite

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

git stash
git pull
git stash pop

同样,此问题可能是由于您位于未与master分支合并的分支上。


5

git reset --hard && git clean -df

注意:这将重置并删除所有未跟踪的文件。


27
一个人不使用斧头从朋友的额头上去除苍蝇。
HonoredMule

3
在没有意识到某些文件将被删除的情况下,请勿使用此功能。
andromeda '18


4

解决此问题的最佳方法是:

git checkout -- <path/file_name>

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

git pull origin master

我有提到的问题,因为我更新了索引以假定文件未更改。它仍然不会让我去做。我git checkout -- path/*只使用了一次,它允许我执行之后的拉动。
斯蒂芬·奥弗林


4

这是我解决问题的策略。

问题陈述

我们需要对10个以上的文件进行更改。我们尝试过PULL (git pull origin master),但是Git大喊:

错误:您对以下文件的本地更改将被合并覆盖:请先提交更改或将其存储起来,然后再进行合并。

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

实际上,我们处于阶段,因为文件位于“暂存区”(也称为“索引区”)中,而某些文件位于“ Head Area”(也称为“本地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命令。暂存会占用工作目录的脏状态(即,已修改的跟踪文件和已分阶段的更改),并将其保存在未完成的更改堆栈中,您可以随时重新应用它们。


3

如果要覆盖特定的更改,则需要某种方式告诉它要忘记的更改。

您可以尝试选择性地git stash --patch存储要放弃使用的更改,然后使用删除该存储git stash drop。然后,您可以拉入远程更改并按常规合并它们。


3

TL; DR;

git pull --rebase --autostash
  -r, --rebase[=false|true|merges|preserve|interactive]
       When true, rebase the current branch on top of the upstream branch after
       fetching. If there is a remote-tracking branch corresponding to the upstream

  --autostash, --no-autostash
       Before starting rebase, stash local modifications away if
       needed, and apply the stash entry when done

我不知道为什么还没有答案,但是您可以看到解决方案很简单。此处的所有答案都建议相同:删除/保存本地更改并向上游应用,然后(如果您要save)将本地更改放在顶部。

什么git pull --rebase --autostash做一步一步:

1. your local changes saved by `--autostash`
2. your local commits saved by `--rebase`
3. commits from upstream applied to your branch
4. your local commits are restored on top of upstream
5. your local changes are restored to working directory

我的情况(可能也是您的情况):

我有本地更改(工作目录中的更改):

在此处输入图片说明

当我尝试进行远程更改时,出现错误:

在此处输入图片说明

此更改与本地更改不相交:

在此处输入图片说明

因此,当我pull --rebase --autostash本地更改被保存并自动应用时没有任何问题

在此处输入图片说明

现在我的本地更改要低一些: 在此处输入图片说明


2

我有一个特殊的情况:我的文件上带有-假定不变。很难找到,因为该git status命令未显示任何更改


我有着同样的问题。您找到解决它的方法了吗?我想我可以删除然后重新添加假定不变的东西...我所做的只是手动检出这些文件以获取未更改的版本...只是想知道是否有一种方法可以使检出/变基/合并只是覆盖他们。
大卫,

1
不,我不得不放弃整个“假定不变”的事情。

2

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

git stash
git pull
git stash pop

也许您不执行所有操作。您可以知道接下来可以做什么。


然后,您可以使用文件的Git diff-w +名称来确认代码自动合并
YanQing

1

我在回购中忽略了一个文件,当我这样做时git pull upstream master,出现以下错误:

错误:您对以下文件的本地更改将被merge覆盖:myfile.js请在合并之前提交更改或存储更改。堕胎

为了解决这个问题,我做了以下工作

git update-index --no-assume-unchanged myfile.js

然后我git status得到了这个消息

在分支母版上您的分支落后“起源/母版” 4次提交,并且可以快速转发。(使用“ git pull”更新您的本地分支)

未上演提交的更改:(使用“ git add ...”更新将提交的内容)(使用“ git checkout-...”放弃工作目录中的更改)

修改:myfile.js

没有添加任何更改来提交(使用“ git add”和/或“ git commit -a”)

然后我做git checkout myfile.jsgit pull upstream master。这次git pull操作成功。


1

我从主人那里拉过来的时候遇到了这个问题。

我使用Visual Studio处理它的方式;

  1. 首先,我对解决方案执行了撤消提交。
  2. 然后,我进行了Git拉动过程。

希望这可以帮助!



1

我是git的新手,不确定我的解决方案是否是个好主意。

我已经测试了所有答案,但没有一个对我有用!

但是我找到了另一个解决方案:

1. Backup both of local and repository versions of the file.
2. Delete the file from repository.
3. git add .
4. git commit
5. git push

希望这可以帮助。


1

出现错误“您对以下文件的本地更改将被合并覆盖”,是因为您在本地存储库中有一些尚未提交的更改,因此在从远程存储库提取之前,只需在本地存储库中提交更改。

假设您的远程仓库有一些分支xyz,然后您希望将该远程仓库xyz分支合并到(复制到)本地仓库xyz分支中,

{
git checkout xyz                  //check out to the respective branch in local repo
git commit -m "commiting message" //commit changes if any, in local repo branch xyz
git pull                          //it pulls remote xyz branch into local xyz branch
}

0

如果此错误是由于行尾引起的,

git add
git checkout mybranch

将工作。我不太确定为什么行得通。



0

如果git-lfs使用此消息并且文件指针被实际文件覆盖,也会发生此消息。

然后您使用:

git stash
git lfs migrate import
git pull

我的案子的全部输出

λ git stash
Saved working directory and index state WIP on master: 5d4ad47 Merge branch 'feature/...' into 'master'
Encountered 1 file(s) that should have been pointers, but weren't:
        public/apple-touch-icon.png

λ git pull
Updating 5a4ad44..b25f79d
error: Your local changes to the following files would be overwritten by merge:
        public/apple-touch-icon.png
Please commit your changes or stash them before you merge.
Aborting

λ git lfs migrate import
migrate: Fetching remote refs: ..., done
migrate: Sorting commits: ..., done
migrate: Rewriting commits: 100% (0/0), done
migrate: Updating refs: ..., done
migrate: checkout: ..., done


λ git pull
Updating 5d4ad47..a25c79a
Fast-forward
 public/apple-touch-icon.png | Bin 2092 -> 130 bytes
 public/favicon.ico          | Bin 6518 -> 1150 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)

参见https://github.com/git-lfs/git-lfs/issues/2839


0

我已经尝试过并且成功完成了,在拉取之前,先提交所有尚未提交的文件,然后您将不会从AS收到该消息。

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.