如何在Git中不提交代码即可保存进度并支持后续回滚?
如何在Git中保存未完成工作进度并继续开发(无永久提交历史)
我完全懂你的需求——开发时想尝试新方案,又不想把半成品提交到正式分支的历史里,还得能随时回退到尝试前的状态,同时继续在当前代码上迭代。git stash之所以让你觉得不适用,应该是因为它默认会清空工作区,但其实有几个更贴合你需求的技巧:
方法1:用git stash create生成快照(不改动工作区)
这个方法完美匹配你的需求:它会把当前工作区和暂存区的修改保存成一个stash快照,但不会清空你的工作区,你可以继续写代码。
步骤如下:
- 保存当前状态:执行
git stash create,Git会返回一个哈希值(比如a1b2c3d),把这个哈希记下来;也可以加个备注方便后续查找:git stash store -m "WIP: 尝试新方案前的状态" a1b2c3d - 继续开发:正常写代码、提交,完全不受现有快照的影响
- 回滚到之前的状态:如果新方案行不通,执行
git stash apply <哈希值>,就能把之前保存的状态恢复到工作区(有冲突的话解决冲突即可)
如果之后确认不需要这个快照了,直接忽略它就行,不会留在分支的提交历史里。
方法2:临时分支存WIP提交
如果你更习惯用分支来管理状态,也可以创建一个临时分支存放未完成的工作:
- 创建并切换到临时分支:
git checkout -b wip-temp - 提交当前未完成的工作:
git add .,然后git commit -m "WIP: 尝试新方案前的草稿"(这个提交只会存在于临时分支中) - 切回原分支继续开发:
git checkout 你的主分支名,此时原分支的工作区还是你之前的未完成状态(因为提交操作只在临时分支执行) - 回滚状态:如果新方案失败,执行
git merge wip-temp(把临时分支的WIP提交合并回来),或者直接git reset --hard wip-temp(强制回滚到WIP状态,注意会覆盖当前未提交的修改) - 清理:之后删掉临时分支即可:
git branch -D wip-temp,这个WIP提交不会留在你的主分支历史里
方法3:用git reset临时提交(谨慎使用)
如果你愿意创建一个临时提交,之后再把它从历史里移除,也可以这么做:
- 创建临时提交:
git add .,然后git commit -m "TEMP: 尝试新方案前的状态" - 继续开发:正常写代码、提交新的修改
- 回滚状态:如果要回到临时提交的状态,执行
git reset --soft HEAD~n(n是临时提交之后的提交次数),或者直接git reset --hard <临时提交的哈希> - 清理历史:如果之后确认不需要这个临时提交,用
git rebase -i HEAD~(n+1)把临时提交从历史列表里删掉即可(注意:如果已经推送到远程仓库,不要这么做,会打乱团队协作)
总结
最推荐的是方法1,因为它完全不影响当前工作流程,也不会留下任何冗余的提交历史;方法2适合喜欢用分支管理的人,操作直观;方法3适合临时快速保存,但要注意清理历史的风险。
内容的提问来源于stack exchange,提问作者Christopher Shroba
相关产品推荐
相关产品推荐

