好吧,假设有一天我们碰巧做了一堆修改,当我们提交它们时,我们发现我们在错误的分支上工作。
我们如何强制 git 切换分支而不丢弃本地更改。
我可能会在等待回复时以一种天真的方式解决这个问题,但我想知道是否有正确的程序,因为如果我说我以前没有发生过这件事,那我就是在撒谎...
- 备份更改的repo
git reset --hard
git checkout 右分支
- 恢复更改
git commit -m "changes"
最佳答案
有很多不同的方法,具体取决于您走了多远以及您希望它们位于哪个分支。
让我们来看一个典型的错误:
$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop
因此,现在您希望将这些尚未提交给 master
的更改进行 develop
。
如果您还没有
develop
,那么这个方法很简单:$ git checkout -b develop
这将创建一个新的
develop
分支,无论您身在何处 现在。现在您可以提交了,新内容都在develop
上。您确实有
开发
。看看 Git 是否会让你在没有的情况下切换 做任何事:$ git checkout develop
这要么成功,要么报错。如果成功了,太好了!只是 犯罪。如果不是(
错误:您对以下文件的本地更改将被覆盖...
),您仍然有很多选择。最简单的可能是
git stash
(和所有其他回答者一样 这让我不得不点击 post 说)。运行git stash save
或git stash push
,1 或只是git stash
的缩写保存
/推送
:$ git stash
这会提交你的代码(是的,它确实做了一些提交)使用 一种奇怪的非分支方法。它所做的提交不是“在”任何 分支但现在安全地存储在存储库中,所以你现在可以 切换分支,然后“应用”存储:
$ git checkout develop Switched to branch 'develop' $ git stash apply
如果一切顺利,并且您喜欢结果,那么您应该
git stash drop
存储。这会删除对奇怪的非分支 y 提交的引用。 (它们仍然在存储库中,有时可以在紧急情况下取回,但对于大多数用途,您应该认为它们在此时已经消失。)
apply
步骤 merge stash 的更改,使用 Git 强大的底层 merge 机制,这与您进行分支 merge 时使用的是同一种东西。这意味着如果您错误地处理的分支与您打算处理的分支有很大不同,您可能会遇到“merge 冲突”。因此,在假设存储应用干净之前,仔细检查结果是个好主意,即使 Git 本身没有检测到任何 merge 冲突也是如此。
许多人使用 git stash pop
,它是 git stash apply && git stash drop
的简写。就目前而言这很好,但这意味着如果应用程序导致一团糟,并且您决定不想继续沿着这条路前进,那么您将无法轻易取回 stash 的东西。这就是为什么我建议单独 apply
,检查结果,drop
仅当/当满意时。 (这当然会引入另一个点,您可以再喝杯咖啡休息一下,然后忘记自己在做什么,然后回来做错的事情,所以这不是一个完美的治疗方法。)
1git stash save
中的save
是创建新存储的旧动词。 Git 版本 2.13 引入了新动词,使事情与 pop
更加一致,并为创建命令添加了更多选项。 Git 2.16 版正式弃用了旧动词(尽管它在 Git 2.23 中仍然有效,这是我编辑本文时的最新版本)。
关于git 切换分支而不丢弃本地更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22082307/