错误:您对以下文件的本地更改将被checkout覆盖

223

这个问题类似于这个问题,但更具体。

我有一个包含两个分支的项目:stagingbeta。 我在 staging 上进行开发,并使用 master 分支修复错误。因此,如果我在 staging 上工作时看到一个错误,我会切换到 master 分支:

git checkout master

并执行这些操作:

git add fileToAdd
git commit -m "bug fixed"

然后我合并两个分支:

git checkout staging
git merge master
git checkout beta
git merge beta

不管工作树上是否有其他文件都不重要。

但是现在,当我尝试切换到master分支时,我遇到了一个错误

error: Your local changes to the following files would be overwritten by checkout:
src/Pro/ConvocationBundle/Controller/DefaultController.php
Please, commit your changes or stash them before you can switch branches.
Aborting

我认为我应该从暂存区中删除这个文件:

git reset HEAD src/Pro/ConvocationBundle/Controller/DefaultController.php

但是我遇到了同样的错误。 如果我执行git status,我会得到没有更改可提交


4
你尝试过执行reset --hard吗?如果你确定要放弃你的修改,就使用它。或者如果不想丢弃修改,可以使用stash命令。 - keltar
@keltar - 不。我不想放弃我的更改。只需将它们保留在工作树上以供稍后提交即可。 - Manolo
1
我认为你不能在保留未提交更改的情况下切换分支,但我可能错了 - 这不是我的专业领域。尝试使用 git add your-file 命令并提交更改。 - keltar
1
@keltar - 我以前就是这样工作的。我现在不想在“staging”上提交任何更改。 - Manolo
1
也许你之前尝试过,但是冲突的文件并没有被更改。你已经做出了修改,Git必须将它们保存在某个地方以便稍后恢复。如果没有提交,这很不可能实现。但是,如果你真的不想提交 - 使用stash,这正是它存在的原因。 - keltar
显示剩余2条评论
10个回答

271

警告:运行此操作将丢弃本地更改。仅在您想要舍弃本地更改时才运行此操作。

我遇到了同样的问题,通过

git checkout -f branch

并且它的规范非常明确。

-f,--force

当切换分支时,即使索引或工作区与HEAD不同,也要继续操作。 这用于放弃本地更改。

从索引中检出路径时,不要在未合并的条目上失败; 相反,未合并的条目将被忽略。


11
当我的 Git 卡住时(没有本地更改,但仍然出现错误),这个解决方案帮助了我! - lukyer
24
谢谢你,你拯救了我的屏幕免于被拳头砸坏。 - Owl
7
我以那种方式丢失了我的更改。 - Jacek Dziurdzikowski
8
这样做会导致您失去更改,这应该附带一个重要的警告。 - Alexander Mills
我想要相反的情况。主分支在我的分支后面,而且我已经更新到最新的主分支,但仍然无法切换分支。一定是 Git 的 bug。 - jgmjgm

191

当您修改文件并且要切换的分支也对此文件进行了更改(从最新合并点开始),则会出现错误。

我认为您有以下选择:

  • 提交当前更改,然后使用 amend 命令追加额外的更改(在 git 中可以修改提交记录,只要它们没有被推送);
  • 使用 stash 命令:
    git stash save your-file-name
    git checkout master
    # do whatever you had to do with master
    git checkout staging
    git stash pop

git stash save命令会创建一个包含您更改的存储区,但它不与任何提交或分支相关联。 git stash pop命令会将最新的存储条目应用于您当前的分支,恢复保存的更改并将其从存储区中移除。


3
谢谢。您确定这不会对我的工作树(未添加的文件)进行任何更改吗?我不想丢失我的更改 :-/ - Manolo
1
糟糕,当我实际上应该使用“保存”时,我输错了“添加”..已更新。你的意思是,对于其他文件?如果不带文件名参数运行git stash save,它将保存所有修改过的文件,并将它们还原为最新提交的状态。而且,拥有额外的目录树副本从来不会有坏处,但我总是对此感到非常担心。 - keltar
我不确定你的意思。是的,你可以在另一个分支上应用stash,但它只会替换文件内容,而不是合并它们。 - keltar
1
@Honey,这与分支无关,问题在于未提交的更改。按定义,Checkout 必须将文件重置为“master”的状态,但这样做会丢失当前内容,由于这些内容未提交,因此以后无法返回到此状态,因此会出现错误,以免稍后因丢失更改而感到不安。 - keltar
1
@AliRaza 它将创建新的存储条目。您可以通过 git stash list 查看它们。 - keltar
显示剩余16条评论

19

如果您不想提交本地更改,可以强制检出您的分支。

git checkout -f branch_name

1
sudo 不是必需的,它只会破坏文件权限。这与 @kiki_yu 一年前发布的相同 git 命令,但更糟糕。 - kenorb
2
我以那种方式丢失了我的更改。 - Jacek Dziurdzikowski
2
@JacekDziurdzikowski,所以你两次丢失了更改(请参见kiki_yu答案的评论),都是通过应用非常明确提到放弃本地更改是目的的解决方案来实现的。我的讽刺探测器坏了还是...你是认真的? - Romain Valeri
1
@RomainValeri 嗯,我想那是我的方式来警告那些刚开始使用git的人(如果他们正在阅读这篇文章,他们必须是初学者),准备好说再见了任何他们所做的更改。我当时认为,在一个分支中进行的更改应该保留在该分支上,直到我再次检出它。对于那些也这样想的新手的提示:使用git stash :) - Jacek Dziurdzikowski
重复的答案,毫无意义。第一个答案甚至提供了更多信息。 - MAChitgarha

11

我遇到了同样的问题,并通过

git checkout -f branch

注意使用-f开关时要小心,如果使用-f开关,您将失去所有未提交的更改。虽然在某些情况下使用-f可能很有用,但在大多数情况下,您可能希望使用stash命令保存您的更改然后再切换分支。stashing过程已在上面解释过。


我以那种方式丢失了我的本地更改。 - Animesh Kumar

10

当你需要切换到的分支拥有当前分支没有的提交时,就会发生此错误。

如果你在尝试切换到一个新分支时看到此错误,则意味着你的当前分支可能落后于一个或多个提交。如果是这样,请运行以下命令:

git fetch

你还应该删除可能与目标分支冲突的依赖项。

例如,对于iOS开发者:

pod deintegrate

如果您想要检出一个分支,请尝试再次检查该分支。

如果所需的分支不是新的,则可以挑选提交并解决冲突,或者保存更改,然后解决冲突。

1. Git Stash(推荐)

git stash
git checkout <desiredBranch>
git stash apply

2. 挑选(更多的工作)

git add <your file>
git commit -m "Your message"
git log

复制您的提交的 SHA。然后放弃不需要的更改:

git checkout .
git checkout -- . 
git clean -f -fd -fx

确保你的分支是最新的:

git fetch

然后切换到所需的分支

git checkout <desiredBranch>

然后挑选另一个提交:

git cherry-pick <theSha>

现在解决冲突。

  1. 否则,您的另一个选择是使用以下命令放弃当前分支的更改
git checkout -f branch

1
我曾经遇到过同样的错误。实际上,我试图使用新的更新包覆盖Flutter旧的SDK包,所以出现了这个错误。
我使用VS Code打开Flutter SDK目录并清理了项目。
在VSCode命令行中使用以下代码: git clean -dxf 然后使用 git pull

1
Keltar的回答中的解释非常好(我已经点赞了),但我想给出一个不同的答案,因为我认为它不是准确的。Git考虑的并不是目标分支/提交自上次合并点以来修改文件的变化情况,而是取决于修改后的文件是否与HEAD和目标提交相同。如果文件相同,Git就没有问题地检出并保留您在工作树中的文件。然而,如果至少有一个修改过的文件在HEAD和目标提交/分支之间不同,那么Git将拒绝检出,因为这需要进行一次合并才能移动到那个位置。有人可能会说,这与接受的答案所说的一样,对吗?嗯,不完全是。一个文件可以在许多不同的情况下在目标分支历史记录中具有提交,即使内容相同...比如:

  • 在目标分支历史记录中对文件进行了提交,然后撤销了提交。
  • 相同的更改应用于两个历史记录。

而且这还没有考虑向前/向后移动历史记录的情况。所以,请记住:HEAD与目标提交进行比较。


0
你可以在当前分支提交,切换到另一个分支,并最后选择该提交(而不是合并)。

如果您能提供更多的解释,那将会更有帮助。 - MAChitgarha

0
在我的情况下,这是一些不同的事情。
我创建了一个提交并推送它,后来我执行了git update-index --assume-unchanged <file>并编辑了内容以在本地使用,但当我想要切换到另一个分支时,git提示我出现错误。
我的解决方案是撤销本地更改,然后检出所需的分支并在那里进行本地更改。

0
如果你们正在使用任务运行器,那么应该先停止它,进行 Git 更改,然后再次运行任务运行器。否则,任务运行器会监视并更改跟踪文件,这些文件可能是你正用 Git 进行注释的。

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