在 git 中放弃当前更改后切换分支

47

我克隆了一个git仓库,并在其主分支中进行了一些更改。过了一段时间,我想忽略我刚刚做的更改(而不将它们提交),并切换到另一个分支。但是,由于有未提交的更改,它阻止了我进行切换。我如何在不使用stash的情况下忽略这些更改?具体情况如下:

$ git checkout gh-pages
error: Your local changes to the following files would be overwritten by checkout:
        somefile.txt
Please, commit your changes or stash them before you can switch branches.
Aborting
9个回答

74
选项1
git checkout -f gh-pages

选项2
git reset --hard     # beware: don't make that a habit
git checkout gh-pages

3
选项1行不通了。Git是一个庞大而不情愿解决问题的巨人。我被迫养成了使用git reset --hard ..命令的习惯。这是Git命令中修复所有问题的圣杯。 - Shailen
2
@shailenTJ 你应该成为一名诗人 :) 请放心,我经常使用git reset --hard。但事实上,这是一种强大的武器,你不应该在没有仔细考虑的情况下使用它,因为它会清除任何未提交的更改(或者至少添加到索引一次的更改,而这将很难恢复)。 - sehe
选项2对我没有用,它只是重复了错误。Git简直是噩梦。 - Owl
1
我从未见过“Git是一场彻底的噩梦”这样的错误。它还有其他信息吗?是时候提出你自己的问题了,@Owl? - sehe
git checkout -f gh-pages 对我很有效。我有一些挂起的CRLF文件,在另一个分支中得到了修复。stash和stash drop仍然不允许我检出不同的分支。我注意到当我在-f之后返回分支时,我的CRLF文件仍在等待。 - zerocog

12

仅为完整起见,以及那些通过搜索着陆到这里的人:尽管OP专门要求不使用stash解决方案,但值得一提的是stash确实是一个非常好的选择:

该命令将本地修改保存,并将工作目录还原为HEAD提交所匹配的版本。

所以你只需要:

git stash

这就像重置为HEAD一样。当绝对确定那些未提交的更改是无用的时,只需要

git stash drop

如上文档链接所述,您甚至可以拥有多个存储区等。

我建议这种做法,因为它可以让人们养成在没有重大代价的情况下在重置之前进行双重思考的习惯。


6
您可以忽略所有未提交的更改。 git reset --hard HEAD

3
如果您有未暂存的文件,请尝试执行以下操作:

git checkout -- .

或者

git checkout -- filename

这解决了我的问题,谢谢。看起来这个问题可以通过 git checkout -- . 或 git reset --hard 解决。其中之一应该可以解决它。 - Owl

3

如果你确实确定想要丢弃未提交的更改(即那些已经暂存和工作树中的更改),可以执行以下命令:

git reset --hard

总的来说,藏匿通常更安全。

我真的想放弃我的更改,但它不让我这样做。我已经尝试了git reset --hard,也尝试了暂存和丢弃暂存。救命啊,拯救我脱离这可怕的版本控制软件。 - Owl
@Owl 我认为最好为你的问题创建一个新的问题,包括 git status 的输出。 - Mark Longair

0

git add -A git stash

这将清除您所做的所有更改(仅限未提交的更改)。


0

您可以放弃对特定文件所做的更改:

git checkout somefile.txt

然后平稳地跳转到分支:

git checkout gh-pages

0

引用 选项2对我没有起作用,它只是重复了错误。

我也是一样。在执行git reset --hard + git checkout之后,我仍然遇到了相同的错误。

我通过在第二个命令后面添加--force来解决了这个问题,就在硬重置之后。

git reset --hard
git checkout -f <branch name>

0

忽略但不删除更改

OP要求忽略更改,但并未要求删除它们。听起来像是OP希望更改仍然存在。因此,这个答案是为那些处于类似情况的人准备的,他们不想失去自己的更改

考虑到已经遇到的限制,再加上您想保留这些更改,一个选项是将它们放在另一个分支中。

无论您有未提交或已暂存的更改在哪里,您都可以始终使用以下命令创建一个新的分支:

git checkout -b new_branch

然后根据需要使用git addgit commit。现在,您可以随意切换到其他分支,因为这些更改已保存。

像OP一样,我不喜欢使用stash和pop(以及cherry pick),但通过将这些更改放入新分支中进行隔离,我可以很好地合并和变基。对我来说,使用分支解决方案非常容易。


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