好的,假设有一天我们进行了大量修改,当我们想要将其提交时,我们发现我们正在错误的分支上工作。
如何强制Git切换分支而不丢弃本地更改。
我可能会在等待回复的同时以一种天真的方式进行操作,但如果有正确的步骤,我想知道,因为我不得不承认这种情况以前发生过...
- 备份更改后的仓库
git reset --hard
git checkout right-branch
- 还原更改
git commit -m "changes"
好的,假设有一天我们进行了大量修改,当我们想要将其提交时,我们发现我们正在错误的分支上工作。
如何强制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
现在您希望这些更改应用到develop
分支,但是它们还没有被提交到master
分支。
如果您还没有develop
分支,那么此方法很简单:
$ git checkout -b develop
这将从当前位置创建一个新的develop
分支。现在您可以提交,新内容都在develop
上。
您确实有一个develop
。请尝试切换而无需进行任何操作:
$ 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 stash pop
,这是git stash apply && git stash drop
的简写形式。 虽然这样做没什么问题,但如果应用程序的结果很混乱,并且您决定不想继续沿着这条路走,就不能轻松地获取暂存内容。这就是为什么我建议分别使用apply
命令,检查结果,只有在满意时再使用drop
命令。(当然,这样会引入另一个点,您可能会在此期间休息一下,忘记自己正在做什么,回来后执行错误的操作,因此它并不是完美的解决方案。)git stash save
中,“save”是创建新暂存内容的旧动词。 Git 2.13 版本引入了新动词,以使事情更加一致,并向创建命令添加更多选项。 Git 2.16 正式弃用了旧动词(尽管在我编辑此文本时,最新版本为 Git 2.23,旧动词仍然可以使用)。git stash
的意思是先进行一些提交,然后将我的更改拿走,因为它们已经安全地保存在存储提交中。所以当你把它们藏起来后,它们当然就消失了:这就是藏起来的目的,既可以摆脱它们,同时也可以保存它们。你必须随后使用git stash apply
来取消隐藏它们。在这两个步骤之间,您可以随意切换分支。 - torekgit stash
只是进行提交而已。Git的几个版本中已经出现了一些引入错误的git stash
,因此我现在建议 尽可能避免 使用git stash
。 - torek使用 git stash
git stash
它将更改推到堆栈中。当您想要将它们拉回时,请使用
git stash apply
你甚至可以单独提取项目。
完全清除暂存区的方法:git stash drop
git stash drop
;git stash clear
会清除整个贮藏堆栈,包括可能与这组命令无关的贮藏。请注意不要改变原文的意思。 - Lelandgit stash
保存你的工作git checkout <your-branch>
git stash apply
或者 git stash pop
加载你最后保存的工作git stash
命令可以保存你未提交的更改git stash list
命令可以列出你保存的未提交更改的备份列表git stash apply stash@{x}
命令中的x代表你所做的备份编号(可以是0,1,2...等等)--merge
/-m
选项来进行 git checkout
:
git checkout -m <另一个分支>
-m --merge
当切换分支时,如果你有一个或多个文件在当前分支和要切换的分支之间存在差异并且这些文件已经被修改了,该命令会拒绝切换分支以保护你的修改内容。但是,使用此选项时,会在当前分支、工作树内容和新分支之间进行三方合并,然后你将进入新分支。git checkout thatbranch
命令,如果完全安全且您所做的更改未涉及到被检出更新的文件,则此命令可行。 - jthill$ git switch -c <another-branch> --merge
- projektorius96使用git stash
将你的更改存储起来,或者
创建另一个分支并在那里提交你的更改,然后将该分支合并到你的工作目录中
git stash
是 Git 工具中用于保存当前工作进度的命令。当你需要切换分支但是当前工作还没有完成,又不想提交未完成的工作时,可以使用git stash
命令将工作区和暂存区的修改保存起来,以便稍后恢复。你可以在任何时间通过git stash apply
命令重新应用保存的工作进度,并继续进行原来的工作。 - zerkms