如何忽略在'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个回答

647

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

如果您想要删除工作副本中的所有本地更改 - 包括那些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进行暂存。


4
诀窍在于使用 git checkout HEAD^ path/to/file/to/revert。使用 HEAD^ 才是关键所在。 - mae
2
@user1132363:这会检查之前的版本而不是当前已检入的版本。我不认为这是正确的方法。 - Daniel Hilgarth
2
如果我在工作副本中没有更改的文件,无法进行存储怎么办?尽管没有本地更改,我仍然会收到错误消息。 - Micah Walter
2
我没有任何未储存的本地更改,但我仍然收到了这个错误。 - jpmc26
1
我不得不从中省略掉 "save --keep-index"。 - Peter Mortensen
显示剩余12条评论

458

这对我很有效,可以覆盖所有本地更改,而且不需要身份验证:

git reset --hard
git pull

3
如果您只想重新开始并使您的 git pull 工作,那么这是最简单的解决方案。 - mikey
如果一个文件没有被跟踪,而且git pull抱怨了这个文件,那么这种方法就不起作用了,因为未来的提交已经添加了一个具有相同文件路径的文件。 - Sad Pencil

426

在另外两个回答的帮助下,我想到了一个直接的解决方案:

git checkout HEAD^ file/to/overwrite
git pull

14
这对我很有效。您能否详细说明一下,即这究竟是在做什么? - cdcdcd
4
它正在放弃本地更改,回到HEAD引用,这很可能是主分支中最后一次提交。 - k3a
38
为什么要使用HEAD^而不是HEAD? - Yura
24
HEAD^是HEAD^1的简写,它基本上表示在HEAD之前的那个提交。你也可以使用HEAD^2来得到那个前面的提交。欲了解更多信息请参考http://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Ancestry-References和https://dev59.com/rHI-5IYBdhLWcg3wO1vl。 - davidneedham
10
好的,我会尽力完成您的翻译需求。接下来是需要翻译的内容:请在回答中解释这个功能是做什么的。 - endolith
显示剩余3条评论

127

这里有很多答案,我不想再添加另一个,但以上所有的方法都比它们需要的要繁琐。Git经常会变得混乱并说我的文件已被修改(无法还原因为它们没有变化,但是我无法拉取因为它们似乎已经改变)。到目前为止,我发现最简单和最快的方法是:

git stash
git stash drop
git pull

注意:本地更改将会丢失


6
嗯...不太好的建议。在执行"stash and drop"之后,你将会失去本地所做的更改 =( - Eugen Konkov
9
这就是重点...Git将本地更改视为不需要保留的更改,而我们也没有进行任何需要保留的更改。这样你就可以快速抛弃所有本地更改,然后继续前进! - Brian Knoblauch
@jimsmith 既然抛弃本地更改是这个过程的重点,我仍然在努力理解最后一部分是否真的有必要! - Brian Knoblauch
1
我没有保留任何本地更改,所以这对我来说非常完美(而且高效),所以我可以拉取。 - KYLO
如果一个文件没有被跟踪,而且git pull抱怨了这个文件,那么这种方法就不起作用了,因为未来的提交已经添加了一个具有相同文件路径的文件。 - Sad Pencil

82

这是一个丢弃已暂存更改的解决方案:

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

12
令人恼火的是,如果感知到的差异来自于文件被签出时换行符发生了改变,那么这种方法将无法解决问题。 - DanielSank
这是我认为最好的答案,因为它不会破坏任何已经存在的项目,但解决了文件阻止拉取的问题。 - theRiley
3
@Timo 我不记得了,那是七年前的事情。 - DanielSank

81

在合并前,您可以将更改提交,也可以将它们存储:

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

13
重点是,你不应该这样做。只需将当前的HEAD材料合并进来!这很简单,Git和其他所有版本控制系统都可以做到......但是没有。Linus让它变得很麻烦使用。 - Jon
@Jon 这个解决方案适用于Ubuntu,我还没有找到比这更好的东西。 - Suneel Kumar
很遗憾,“--autostash”选项只能与“--rebase”选项一起使用。 - Eugen Konkov
这会引入很多问题,不值得这样做。加载需要至少5分钟的时间。还会引发“文件取消链接”错误。我投反对票。 - Philip Rego
1
保存选项是否类似于没有保存的 git stash?git stash pop 意味着从堆栈中取出最后一个工作区保存,并将其应用于索引。 - Timo

62

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

git checkout -- <file>

然后你可以通过以下方式来覆盖文件中的最新版本:

git pull

@pabloasc 这会破坏你在那个文件中的本地更改。 - Suneel Kumar
7
可以的:“如果我想覆盖它们怎么办?” - David
2
原问题无法解决此问题,这个答案可能会让那些盲目复制粘贴命令的人产生噩梦。 - Suneel Kumar
如果您已经提交了一个版本,您需要通过 git reset HEAD~ 撤销该版本,然后再执行 git checkout - dopexxx
1
git checkout -- <file> fails with error: pathspec '<file>' did not match any file(s) known to git. - A__
如果我只是想合并更改怎么办?我可以处理后果和冲突。但为什么它会拒绝呢? - Nyerguds

57
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
我不知道为什么这个问题还没有得到答案,但是解决方案非常简单。所有答案都建议同样的步骤:删除/保存本地更改并应用上游,然后(如果你保存了)在上面应用你的本地更改。 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

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

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

enter image description here

当我尝试拉取远程更改时,我会收到错误提示:

enter image description here

这些更改与本地更改不重叠:

enter image description here

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

enter image description here

现在我的本地更改稍微降低了一些:

enter image description here

干得好!你能把顶部的“TLDR”去掉吗?也许改成“这是更好的答案-请仔细阅读”。 - learning2learn
@learning2learn:请问您能描述一下为什么您不喜欢TLDR吗? - Eugen Konkov
1
因为我认为它值得一读,而且对我来说,“TL;DR”(太长没看)意味着内容过于冗长,也许不值得阅读。但是,在所有不同的问题回答中,这个回答最接近我的问题,并且正好满足了我所寻找的东西。(我之前使用过stash,但不知道有自动储藏命令行选项)。我认为你的回答应该得到更多的赞。 - learning2learn
错误:无法拉取,因为您有未合并的文件。 提示:在工作树中修复它们,然后使用“git add/rm <file>”提示:适当地标记解决方案并进行提交。 - Fernando Torres
2
这个答案是独特且非常重要的。 - Saad
那么,“你的本地提交被还原到上游”是指它们会与传入的数据正确自动合并吗?(不考虑冲突;我显然可以在本地处理这些冲突) - Nyerguds

31

如果您的代码库中包含一些从 master 中删除的文件:

  1. git checkout master (切换到主分支)
  2. git fetch origin(从远程仓库获取最新代码)
  3. git reset --hard origin/master(强制将本地代码与远程代码同步)
  4. git checkout -b newbranch(创建并切换到一个新的分支)

git reset --hard origin/master 是所有解决方案中唯一有效的方法。谢谢。 - Riley Hemphill
非常感谢!我尝试了以上所有答案,但都没有起作用。我什么也没改,文件A仍然出现错误,当我尝试使用stash时,其他10个文件也出现了错误。一遍又一遍地重复... git reset --hard origin/<branch> 确实有帮助! - Lenka Čížková
这是唯一能为我工作的方法。谢谢! git checkout -b newbranch 不在范围内。问题是拉取,所以应该使用 git pull - lcompare

23
有时候,这些方法都不起作用。令人烦恼的是,由于LF问题,删除文件,然后再拉取可能会起作用。我并不推荐这种解决方案,但如果该文件不存在,git就不会无用地告诉你,你的更改(甚至可能不是更改)将被覆盖,并让你继续进行操作。
自行决定使用风险。

2
当你因为行结尾而卡住时,这个方法可以拯救你的生命。 - Dan Pisarski
这对我不起作用。文件在本地不存在,但我仍然收到错误信息。 - PRMan
这甚至在其他建议都无法解决的情况下,也适用于 git 合并主分支。 - andrew lorien
我遇到的情况是,在本地 repo 上删除了文件,当我进行拉取操作时,弹出了"本地更改将被合并覆盖"的提示。 - Clint Angelo 'Tec' Mercado
对我来说也是如此。尝试了git checkout HEAD^、git checkout HEAD --和git checkout --。我正在处理自己的文件,从未触碰过有冲突的文件。我不想stash然后覆盖所有内容,只想解决冲突...所以最终删除了文件并重新拉取。 - cbishop
对我来说,这是唯一的解决方案。Git 告诉我必须提交 ../environment.ts 文件,但是我没有在那里做任何更改,也不能使用 git stash。我删除了该文件,然后就能够再次 git pull 了。我从源中获得了完全相同的 environment.ts 文件。 - MikhailRatner

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