372

我在一个 git 分支上工作,并准备好提交我的更改,所以我提交了一个有用的提交消息。然后,我心不在焉地对不值得保留的代码进行了微小的更改。我现在想更改分支,但 git 给了我,

错误:您对“X”进行了本地更改;不能切换分支。

我可以在不提交的情况下更改分支吗?如果是这样,我该如何设置?如果没有,我该如何摆脱这个问题?我想在不提交的情况下忽略微小的更改,而只是更改分支。

4

16 回答 16

480

你需要一个干净的状态来改变分支。只有在不影响“脏文件”的情况下才允许分支结帐(正如Charles Bailey在评论中所说)。

否则,您应该:

  • 存储您当前的更改或
  • reset --hard HEAD (如果您不介意丢失这些小改动)或
  • checkout -f(切换分支时,即使索引或工作树与 HEAD 不同,也要继续。这用于丢弃本地更改。)

或者,最近:

即使索引或工作树与 HEAD 不同,也要继续。
恢复索引和工作树以匹配切换目标。

这与 不同git switch -m <branch-name>,后者触发当前分支、工作树内容和新分支之间的三向合并:您不会以这种方式丢失正在进行的工作。

于 2009-08-20T08:02:06.170 回答
143

如果您想放弃更改,

git checkout -- <file>
git checkout branch

如果您想保留更改,

git stash save
git checkout branch
git stash pop
于 2009-08-20T19:29:18.793 回答
71

嗯,应该是

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop
于 2009-10-11T08:48:17.453 回答
25

跟随,

$: git checkout -f

$: git checkout next_branch
于 2009-08-20T08:02:25.873 回答
18

请注意,如果您已合并远程分支或有本地提交并想返回远程 HEAD,您必须执行以下操作:

git reset --hard origin/HEAD

HEAD单独只会指本地提交/合并 - 有几次我忘记了当我完全打算取消所有更改/提交并返回远程分支时.

于 2011-08-03T15:17:11.920 回答
14

这些答案都没有帮助我,因为即使在重置和存储之后我仍然有未跟踪的文件。我必须做:

git reset --hard HEAD
git clean -d -f
于 2018-04-24T16:05:04.803 回答
9

如果您更改了 Git 在切换分支时也需要更改的文件,它不会让您更改。要放弃工作更改,请使用:

git reset --hard HEAD

然后,您将能够切换分支。

于 2009-08-20T08:01:15.470 回答
9

git checkout -f your_branch_name

git checkout -f your_branch_name

如果您在还原更改时遇到问题:

git checkout .

如果要删除未跟踪的目录和文件:

git clean -fd
于 2020-02-24T16:30:00.720 回答
6

跟着这些步骤:

  1. 即使您在分支之间切换,Git stash save 也会保存您的所有更改。
git stash save
  1. Git checkout 任何其他分支,现在既然您保存了更改,您就可以在任何分支中移动。上述命令将确保您的更改已保存。
git checkout branch
  1. 现在,当您回到分支时,使用此命令来恢复所有更改。
git stash pop
于 2020-07-17T07:43:28.797 回答
5

切换到丢失更改的新分支:

git checkout -b YOUR_NEW_BRANCH_NAME --force

切换到丢失更改的现有分支:

git checkout YOUR_BRANCH --force
于 2018-03-01T22:41:37.217 回答
4

简单回答:

是强制结帐一个分支

git checkout -f <branch_name>

强制签出分支是告诉 git 删除您在当前分支中所做的所有更改,并签出所需的更改。

或者如果您正在检查提交

git checkout -f <commit-hash>


“以为我可以在不提交的情况下更改分支。如果可以,我该如何设置?如果没有,我该如何摆脱这个问题?”

答案是否定的,这实际上是 Git 的哲学,即您跟踪所有更改,并且每个节点(即提交)必须与您所做的最新更改保持同步,除非您已经当然做了一个新的承诺。


您决定保留更改?

然后使用

git stash

然后在所需分支中取消隐藏您的更改,使用

git stash apply

这将应用您的更改,但也将它们保留在存储队列中。如果您不想将它们保留在存储堆栈中,请使用

git stash pop

这相当于apply然后drop

于 2019-04-29T22:09:54.720 回答
2

如果要保留更改并在单行命令中更改分支

git stash && git checkout <branch_name> && git stash pop
于 2019-02-28T08:37:30.793 回答
2

将未提交的更改移动到新分支

.gitconfig为此创建了一个别名:

[alias]
spcosp = !"git stash push && git checkout \"$@\" && git stash pop --index #"

要更改为new-branch-name,请使用:

git spcosp new-branch-name

并且将保留任何未提交的文件和索引更改。

于 2019-06-08T09:43:34.247 回答
1

关闭终端,删除你的项目所在的文件夹,然后再次克隆你的项目,瞧。

于 2018-03-12T19:24:01.653 回答
1

为了您的精神平静(为了更容易地访问您在进行分支切换时未提交的更改)

切换前:

git checkout <next_branch>

采用

git stash save "brief description of changes"

而不是默认值:

git stash    
// or
git stash save

如果您git stash list的列表较长并且必须切换回从某个地方开始的某个先前的想法,这将是值得的。

于 2021-10-15T12:15:40.987 回答
0

当 git stash 不起作用时切换到其他分支而不提交更改。您可以使用以下命令:

git checkout -f 分支名称

于 2020-06-15T17:51:59.690 回答