我正在分支 A ,而功能/任务尚未完成。然后我需要切换到另一个分支 B 以进行快速修复。当我尝试打开另一个分支时,Git强制我保存我的本地更改,否则我将丢失所有本地更改。
我需要提交我的不完整代码。有没有什么方法可以在不提交和丢失任何代码的情况下在多个分支之间切换?或者有更好的方法来处理这种情况吗?
答案 0 :(得分:12)
您可以使用git stash
,这将保存更改而不创建提交。 1
首先,隐藏您的更改:
$ git stash
然后切换到您的其他分支:
$ git checkout branch-B
当您正在阅读时,请返回原始分支并取消暂停更改:
$ git checkout branch-A
$ git stash pop
有关其他用例的更多详细信息和详细信息,请参阅上面链接的文档。
1 从技术上讲,它确实会创建一个提交,但是git stash
使用了一些魔法,所以你实际上并没有看到提交,而Git的工具知道如何妥善处理这些伪提交。
答案 1 :(得分:11)
一个选项,mipadi demonstrates,只需使用git stash
。
另一种选择是简单地提交当前正在进行的工作,切换分支,然后当您准备切换回来时,执行混合重置回到之前的提交:
# While working on "feature" branch,
# you suddenly need to go work on a hotfix:
$ git commit --all --message "Backup my feature work"
$ git checkout -b hotfix master
# You did your hotfix, and are ready to go back to feature
$ git checkout feature
$ git reset head^
在您执行备份提交之前, git reset head^
将在提交时执行混合重置,并且您在备份提交中所做的所有更改都将还原到您的工作副本。来自official Linux Kernel documentation for git reset
(强调我的):
重置索引但不重置工作树(即 保留更改的文件但未标记为提交 )并报告尚未更新的内容。这是默认操作。
答案 2 :(得分:0)
我知道这个问题很古老,我只想分享一种可以帮助您处理这种情况的技术。您实际上可以将其提交到分支,以后再撤消。
1。提交到分支。 (仅提交。请勿按。)
$ git commit --all --message "Commit Message here."
2。如果您想继续在分支上工作,只需签出并撤消上一次提交,而不会丢失最新更改。
$ git reset --soft HEAD~1
请注意--soft标志:这可确保保留未完成修订中的更改。运行该命令后,您将在工作副本中将更改作为未提交的本地修改找到。
您可以阅读更多here。