好吧,假设有一天我们碰巧进行了一系列修改,当我们提交它们时,我们注意到我们正在错误的分支上工作。
我们如何强制 git 切换分支而不丢弃本地更改。
在等待回复时,我可能会以一种天真的方式解决这个问题,但我想知道是否有正确的程序,因为如果我说这之前没有发生在我身上,我就是在撒谎。 .
git reset --hard
git checkout right-branch
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
。您确实有一个
develop
。 看看 Git 是否会让你不用切换
做任何事:
$ git checkout develop
这要么成功,要么抱怨。 如果成功了,那就太好了! 只是 犯罪。 如果不是 (
error: Your local changes to the following files would be overwritten ...
),您仍然有很多选择。
最简单的可能是
git stash
(就像所有其他回答者一样
这让我不得不点击post说)。 运行 git stash save
或 git stash push
、1 或只是简单的 git stash
,它是 save
/ push
的缩写:
$ git stash
这会使用以下命令提交您的代码(是的,它确实进行了一些提交) 一种奇怪的非分支方法。 它所做的提交不在任何“上” 分支,但现在已安全地存储在存储库中,因此您现在可以 切换分支,然后“应用”存储:
$ git checkout develop
Switched to branch 'develop'
$ git stash apply
如果一切顺利,并且您喜欢结果,那么您应该
git stash drop
藏匿。 这会删除对奇怪的非分支提交的引用。 (它们仍然在存储库中,有时可以在紧急情况下检索,但对于大多数目的,您应该认为它们此时已经消失了。)apply
步骤使用 Git 强大的底层合并机制来合并隐藏的更改,这与进行分支合并时使用的机制相同。 这意味着如果您错误地处理的分支与您想要处理的分支有很大不同,您可能会遇到“合并冲突”。 因此,在假设存储应用干净之前,最好先仔细检查结果,即使 Git 本身没有检测到任何合并冲突。
很多人使用
git stash pop
,它是git stash apply && git stash drop
的简写。 就目前而言这很好,但这意味着如果应用程序导致混乱,并且您决定不想沿着这条路继续下去,您将无法轻松取回隐藏的内容。 这就是为什么我建议单独 apply
,检查结果,drop
仅当/当满意时。 (当然,这确实引入了另一点,您可以再喝一次咖啡休息一下,然后忘记自己在做什么,回来后做“错误”的事情,所以这不是一个完美的治疗方法。)
save
中的
git stash save
是用于创建新存储的旧动词。 Git 2.13 版本引入了新的动词,以使事物与 pop
更加一致,并为创建命令添加更多选项。 Git 版本 2.16 正式弃用了旧动词(尽管它在 Git 2.23 中仍然有效,这是我编辑本文时的最新版本)。git stash
它将更改推送到堆栈。当你想把它们拉回来时使用
git stash apply
您甚至可以将单个物品拉出。
彻底清除藏匿物:
git stash drop
git stash
git stash list
git stash apply stash@{x}
git stash
搁置您的更改,或者,