git:切换分支并忽略任何更改而无需提交


318

我正在git分支上工作,可以提交更改,因此我使用了有用的提交消息进行了提交。然后,我无意中对代码进行了微小的更改,这些更改不值得保留。我现在想更改分支,但是git给了我,

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

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


1
我相信只有在更改已提交但未提交时才发生这种情况吗?如果尚未使用git add之类的工具暂存文件,则git checkout可以很好地用于更改分支。
杰里米·沃尔

1
嗨,杰里米,“上演”是什么意思?强迫用户在更改分支之前提交文件似乎不是一个很好的工作流程。例如,如果我在主存储库中并且很快想在分支中检查某些内容。我必须先将代码提交给主服务器,即使代码只写了一半!您是否在说这种情况下确实有可能签出分支机构?
丹尼尔·法瑞尔

@boyfarrell您可以使用'Git stash'来临时保存更改而无需提交。
Howiecamp


1
当您切换到分支而不在旧分支中提交更改时,git尝试将更改合并到新分支中的文件中。如果合并完成而没有任何冲突,则分支分支将成功完成,您可以在新分支中看到更改。但是,如果发生冲突,您将获得error: You have local changes to '<filename>'; cannot switch branches.并且分支不会更改。您可以git checkout -m <branch-name>合并冲突并签出到分支并自己解决冲突,也git checkout -f <branch-name>可以忽略更改。
samad montazeri

Answers:


400

您需要一个干净的状态来更改分支。仅在不影响“脏文件”的情况下才允许分支检出(如Charles Bailey在评论中所述)。

否则,您应该:

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

或者,最近:

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

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


34
“您需要一个干净的状态来更改分支。” 仅当分支更改影响“脏文件”时才为true。
CB Bailey 2009年

10
对于隐藏方法,我键入了“ git stash save”,“ git checkout otherbranch”,最后键入了“ git stash pop”。
Venkat D.

1
目前,我没有看到此错误消息,当我执行“ git status”时,我在一个分支上所做的更改会显示在另一个分支上。有什么改变吗?
Senthil A Kumar,

2
谢谢。结帐-f是我所需要的。我做了git reset --hard git clean -f git checkout mybranch -f
nologo

1
这是Git通过违反分支的基本定义而完全犯错的一件大事。与git分支不同,它意味着从存储库派生出两个完全不同的工作空间。
nehem

125

如果您要放弃更改,

git checkout -- <file>
git checkout branch

如果您要保留更改,

git stash save
git checkout branch
git stash pop

10
Romerun说,事实上什么(是完整的): git stash save(当工作多枝),然后git checkout branchX做一些事情git add/commit -m等等git checkout branchY,并git stash pop取回藏匿
Highmastdon

2
可能是吧。我有一个情况,但在这里我想做的答案说的话,如果我的理解是正确的:藏匿的变化,从Y开关到X,然后在弹出的变化,并承诺他们在十
本·克莱因

1
请注意,git stash save现在不赞成使用git stash push
Argento

此别名简化了在更改分支时保留更改的情况。
汤姆·黑尔

62

好吧,应该是

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop

5
是的,存储是全局的,而不是特定于分支的,如果我在切换分支后存储流行消息,则将获得与其他分支相同的存储
Aditya Mittal

6
应该指出的git stash将默认为git stash save
Charlie-Greenman'8

谢谢您,这对我非常有帮助
Govind Kumar

22

跟随,

$: git checkout -f

$: git checkout next_branch

16

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

git reset --hard origin/HEAD

HEAD 一个人仅会指本地的提交/合并-几次我都忘记了,当我完全打算取消所有更改/提交并返回到远程分支时,在重置并最终显示“您的存储库是X提交在前面。” 。


9

如果您对文件进行了更改,而Git在切换分支时也需要更改,则它不会允许您进行更改。要放弃工作更改,请使用:

git reset --hard HEAD

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


9

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

git reset --hard HEAD
git clean -d -f


4

简单回答:

强制结帐一个分支

git checkout -f <branch_name>

强制检出一个分支是告诉git放弃您在当前分支中所做的所有更改,然后检出所需的更改。

或者如果您正在检查提交

git checkout -f <commit-hash>


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

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


您决定保留更改?

然后将它们藏起来

git stash

然后在所需分支中取消存储您的更改,请使用

git stash apply

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

git stash pop

那等于apply然后drop




1

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

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

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

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

git spcosp new-branch-name

并且所有未提交的文件和索引更改都将保留。


1

git checkout -f your_branch_name

git checkout -f your_branch_name

如果您无法恢复更改:

git checkout .

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

git clean -fd

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.