【发布时间】:2013-08-07 01:00:48
【问题描述】:
我正在分支 A 上工作,但功能/任务尚未完成。然后我需要切换到另一个分支 B 进行快速修复。当我尝试打开另一个分支时,Git 会强制我保存本地更改,否则我将丢失所有本地更改。
我需要提交我不完整的代码。有什么方法可以在多个分支之间切换而不会提交和丢失任何代码?或者有没有更好的方法来处理这种情况?
【问题讨论】:
标签: git git-commit git-checkout git-stash
我正在分支 A 上工作,但功能/任务尚未完成。然后我需要切换到另一个分支 B 进行快速修复。当我尝试打开另一个分支时,Git 会强制我保存本地更改,否则我将丢失所有本地更改。
我需要提交我不完整的代码。有什么方法可以在多个分支之间切换而不会提交和丢失任何代码?或者有没有更好的方法来处理这种情况?
【问题讨论】:
标签: git git-commit git-checkout git-stash
一个选项,如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(强调我的):
重置索引但不重置工作树(即,已更改的文件被保留但未标记为提交)并报告尚未更新的内容。这是默认操作。
【讨论】:
git stash 与任何分支都无关。执行git commit -a -m "stashing" 会保留您工作的上下文。这应该是公认的答案。
git show -s stash 将存储提交显示为两个父提交的合并,其中第一个是存储所基于的 HEAD。并且git stash [save]没有给定消息默认记录分支的名称。
git stash 命令可以存储索引和工作树的状态。提交不会捕获工作树中未暂存到索引的更改。
HEAD 在 Linux (stackoverflow.com/questions/25976794/…) 上似乎区分大小写。如果是这样,则应更新答案以使用HEAD 而不是head。
您可以使用git stash,它将保存您的更改而无需创建提交。1
首先,存储您的更改:
$ git stash
然后切换到你的另一个分支:
$ git checkout branch-B
当你阅读时,回到你原来的分支并取消你的更改:
$ git checkout branch-A
$ git stash pop
有关其他用例的更多详细信息和细节,请参阅上面链接的文档。
1 从技术上讲,它确实会创建一个提交,但 git stash 使用了一些魔法,所以您实际上并没有看到提交,而且 Git 的工具知道如何正确处理使用这些伪提交。
【讨论】:
我知道这个问题很老,我只想分享一种可以帮助您处理这种情况的技术。您实际上可以将其提交到分支并稍后撤消它。
1.提交到分支。 (仅提交。不要推送。)
$ git commit --all --message "Commit Message here."
2。如果您想继续在分支上工作,只需签出并撤消您的最后一次提交,而不会丢失您的最新更改。
$ git reset --soft HEAD~1
注意 --soft 标志:这可以确保保留未完成的修订中的更改。运行命令后,您会在工作副本中发现更改为未提交的本地修改。
您可以阅读更多here。
【讨论】: