更改为主分支时出错:我的本地更改将被结帐覆盖


127

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

我有一个有两个分支(stagingbeta)的项目。

我在上进行开发staging,并使用该master分支来修复错误。因此,如果我正在暂存中并且看到错误,则更改为masterbranch:

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我知道No changes to commit


4
你试过了reset --hard吗?如果您确实确定要放弃所做的更改。否则,请使用藏匿处。
凯塔尔2014年

@keltar-不,我不想放弃所做的更改。只需将它们保留在工作树上以供以后提交
-Manolo

1
我认为您可以在保留未提交的更改的同时切换分支,但是我很容易错了-并不是我真正的领域。尝试git add your-file并提交。
凯塔尔2014年

@keltar-我以前曾以这种方式工作过。我现在不想提交任何更改staging
Manolo 2014年

尝试之前,冲突的文件可能没有更改。您进行了更改,git必须将其保存在某个地方以便以后还原。没有提交是不可能的。但是,如果您真的不想-使用存储,这就是它存在的原因。
凯塔尔2014年

Answers:


128

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

如我所见,您的选择是-提交,然后用额外的更改来修改此提交(您可以在git中修改提交,只要不push编辑它们);或-使用隐藏:

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

糟糕,add实际save更新时输入错误。您的意思是,对于其他文件?git stash save如果需要,不带文件名的参数将保存所有修改的文件(并将它们恢复为最新提交的状态)。并且拥有额外的目录树副本永远不会有任何伤害,但是我对此总是感到偏执。
凯塔尔2014年

事情是保存所有修改过的文件,除了我要添加到master分支的文件。另外,一个选项是pop其他分支的更改吗?
Manolo 2014年

我不确定你是什么意思。是的,您可以在其他分支上应用存储,但是它将仅替换文件内容,而不合并文件。
凯塔尔2014年

1
@Honey与分支无关,问题是未提交的更改。根据定义,检出必须将文件重置为master,但是这样做会丢失其当前内容,并且由于未提交该内容,以后将无法返回此状态,因此会出现错误,因此您以后不会对丢失的更改感到沮丧。
凯塔尔

149

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

git checkout -f branch

并且它的规格相当清晰。

-f,--force

切换分支时,即使索引或工作树与HEAD不同,也要继续进行。这用于丢弃本地更改。

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


7
当我的git卡住(没有本地更改,但仍然是该错误)时,此解决方案对我有帮助!
lukyer 2015年

5
谢谢,您保存了我的屏幕,没有拳头穿过它。
猫头鹰

3
我那样丢失了更改
Jacek Dziurdzikowski 18'2

1
是的,这样做会丢失更改,这应该引起很大的警告。
亚历山大·米尔斯

我反过来想要它。master在我的分支后面,我与master保持联系,但是仍然无法切换分支。必须是git错误。
jgmjgm

12

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

git checkout -f branch_name

1
sudo是没有必要的,它只会破坏文件的权限。这与一年前@kiki_yu发布的git命令相同,但更糟。
kenorb '16

2
我那样丢失了更改
Jacek Dziurdzikowski 18'2

2
@JacekDziurdzikowski因此,您两次丢失了更改(请参见对kiki_yu的答案的评论),这两种方法都是通过应用非常明确地提到丢弃本地更改才是目的的解决方案。我的讽刺探测器坏了还是...你是认真的吗?
RomainValeri

@RomainValeri Hmm,我想这是我警告其他使用git入门的人的方式(如果阅读此文章,他们必须是初学者),准备对他们进行的任何更改说再见。我认为在一个分支中完成更改的时间应该留在该分支上,直到我再次签出为止。向也有这种想法的新人暗示:使用git stash :)
Jacek Dziurdzikowski

重复答案,无故。第一个答案有更多信息。
MAChitgarha

9

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

git checkout -f分支

好吧,请小心-f开关。如果使用该-f开关,您将丢失所有未提交的更改。尽管在某些情况下使用它会有所帮助-f,但在大多数情况下,您可能需要先进行stash更改然后switch分支。stashing上面已说明了该过程。



-1

如果在尝试签出其他分支时收到此消息:

my-mac:myGHProject ~$ git checkout other-branch
error: Your local changes to the following files would be overwritten by checkout:
    src/main/resources/reference.conf

这意味着您需要对已签出的分支进行一些更改,或者需要擦除或隐藏它们,就像上面提到的大多数一样。20次中有19次我更有可能仅提交更改。

my-mac:myGHProject ~$ git branch
  * my-local-branch
  * develop    

my-mac:myGHProject ~$ git status
On branch my-local-branch
   Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 modified:   src/main/resources/reference.conf

my-mac:myGHProject ~$ git add src/main/resources/reference.conf

my-mac:myGHProject ~$ git commit -m "updates on some config"
  [my-local-branch] updates on some config
  1 file changed, 131 insertions(+), 85 deletions(-)

至此,您可以签出另一个分支并轻松地来回切换。

my-mac:myGHProject ~$ git checkout other-branch

my-mac:myGHProject ~$ git status
  On branch other-branch

my-mac:myGHProject ~$ git checkout my-local-branch
  Switched to branch 'my-local-branch'

只要在运行git push origin $ {branch}命令时确保自己都在正确的分支上并推送到正确的分支即可。注意:如果您将项目直接挂接到Intellij,则可以在主窗口的右下角看到更改了分支。

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.