如何把 master 上未提交的改动转移到新分支

在 master/main 上改错了地方?直接 git checkout -b <新分支> 即可——未提交改动会跟着你到新分支,再正常提交。改动跨分支冲突时才需要 git stash 中转。

最佳实践
Git 提交历史与版本恢复示意

最简单的情况直接切分支就行:git checkout -b 新分支名。 Git 的未提交改动(工作区和暂存区)不属于任何分支,从当前 HEAD 创建新分支时它们会保留;切到其他提交时还需满足不会覆盖改动的条件——切到新分支后正常 git add + git commit,改动就落在正确的分支上了。

标准流程

# 当前在 master,已有未提交改动
git checkout -b feature/should-have-been-here
git add -A
git commit -m "这些改动本该在功能分支上"

master 保持干净,改动全部到了新分支。

什么时候需要 stash

只有当切换分支会与你的改动冲突(新分支与 master 在这些文件上有分歧)时 Git 会拒绝切换。这时用 stash 中转:

git stash push -u               # 保存跟踪改动及未跟踪文件,不含忽略文件
git switch -c feature/new origin/develop  # 示例:确实从另一个提交起步
git stash pop --index             # 尝试同时恢复暂存状态,可能有冲突
git status                      # 若 pop 冲突,先解决并核对;stash 条目会保留
git add -A && git commit -m "..."

已经误提交到 master 了怎么办

git status                      # 先确认工作区/暂存区干净,且误提交未共享
git switch -c feature/oops        # 1. 保存成果并切到功能分支
git log --oneline master origin/master  # 2. 核实正确目标,必要时先 fetch
git branch -f master origin/master      # 3. 仅移动未共享的 master 指针

常见问题(FAQ)

Q:checkout -b 切分支会丢改动吗?

不会。Git 只在改动会被覆盖时阻止切换;顺利切换意味着改动原封不动跟过来了。

Q:stash pop 冲突了怎么办?

像解决普通合并冲突一样编辑冲突标记,然后 git add。解决完 stash 条目默认保留,确认无误后 git stash drop 删掉。

Q:能只把部分改动带去新分支吗?

可以:git stash -p 交互式选择要 stash 的部分,其余仍在工作区,并不属于原分支。-p 默认隐含 --keep-index,也不是自动按分支拆分;或先在新分支部分提交,再确认切换不会覆盖剩余改动后返回原分支。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台