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

Dan*_*ell 296 git branch git-checkout

我正在使用git分支并准备提交我的更改,因此我使用有用的提交消息进行了提交.然后我心不在焉地对不值得保留的代码做了一些小改动.我现在想改变分支,但是git给了我,

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

我以为我可以在不提交的情况下改变分支.如果是这样,我该怎么设置呢?如果没有,我该如何摆脱这个问题?我想忽略这些微小的变化而不提交,只是改变分支.

Von*_*onC 373

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

否则,您应该:

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

  • "你需要一个干净的状态来改变分支." 仅当分支更改影响"脏文件"时才为true. (33认同)
  • 对于存储方法,我输入"git stash save","git checkout otherbranch",然后最后输入"git stash pop". (10认同)
  • 谢谢.结帐-f是我需要的.我做了git reset --hard git clean -f git checkout mybranch -f (2认同)

Jam*_*cey 117

如果要放弃更改,

git checkout -- <file>
git checkout branch
Run Code Online (Sandbox Code Playgroud)

如果您想保留更改,

git stash save
git checkout branch
git stash pop
Run Code Online (Sandbox Code Playgroud)

  • 确实是Romerun所说的(完成):`git stash save`(当处理branchY时)然后`git checkout branchX`做一些事情`git add/commit -m`等``git checkout branchY`和`git stash pop`收回藏匿处 (8认同)
  • 可能是吧.我有一个情况虽然我想做的答案是什么,如果我理解正确:存储更改,从Y切换到X,然后弹出更改并在X上提交它们. (2认同)

rom*_*run 58

好吧,它应该是

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop
Run Code Online (Sandbox Code Playgroud)

  • 应该注意`git stash`将默认为`git stash save` (5认同)
  • 是的,stash是全局的,而不是特定于分支的,如果我在切换分支后存储pop,我将获得与其他分支上相同的存储 (4认同)

sim*_*rsh 18

跟随,

$: git checkout -f

$: git checkout next_branch
Run Code Online (Sandbox Code Playgroud)


小智 15

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

git reset --hard origin/HEAD
Run Code Online (Sandbox Code Playgroud)

HEAD 单独只会引用本地提交/合并 - 有几次我忘记了当重置并最终得到"你的存储库是X提前......"当我完全打算核对所有更改/提交并返回到远程分支时.


Gre*_*ill 8

如果您对切换分支时Git也需要更改的文件进行了更改,则不会让您这样做.要放弃工作更改,请使用:

git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)

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


Har*_*ant 8

按着这些次序:

  1. 即使您在分支之间切换,Git stash save 也会保存所有更改。
git stash save
Run Code Online (Sandbox Code Playgroud)
  1. Git checkout 任何其他分支,现在既然您保存了更改,您就可以在任何分支中移动。上面的命令将确保您的更改被保存。
git checkout branch
Run Code Online (Sandbox Code Playgroud)
  1. 现在,当您返回分支时,请使用此命令取回所有更改。
git stash pop
Run Code Online (Sandbox Code Playgroud)


vis*_*ath 7

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

git reset --hard HEAD
git clean -d -f
Run Code Online (Sandbox Code Playgroud)


Kar*_*udi 6

简单回答:

是强制结帐分支

git checkout -f <branch_name>
Run Code Online (Sandbox Code Playgroud)

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

或者如果您正在检查提交

git checkout -f <commit-hash>
Run Code Online (Sandbox Code Playgroud)


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

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


您决定保留更改吗?

然后使用

git stash
Run Code Online (Sandbox Code Playgroud)

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

git stash apply
Run Code Online (Sandbox Code Playgroud)

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

git stash pop
Run Code Online (Sandbox Code Playgroud)

这相当于apply然后drop


Jor*_*ila 5

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

git checkout -b YOUR_NEW_BRANCH_NAME --force
Run Code Online (Sandbox Code Playgroud)

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

git checkout YOUR_BRANCH --force
Run Code Online (Sandbox Code Playgroud)


Ped*_*llo 5

git checkout -f your_branch_name

git checkout -f your_branch_name
Run Code Online (Sandbox Code Playgroud)

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

git checkout .
Run Code Online (Sandbox Code Playgroud)

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

git clean -fd
Run Code Online (Sandbox Code Playgroud)