Git分支切换与修改转移实战指南
2026-03-13
Git分支切换与修改转移实战指南
(把改错分支的代码优雅地挪到新分支)
在日常开发中,几乎每个程序员都会遇到一个很常见的问题:
你正在某个分支上改代码,改了一半突然发现——
哎,不对,这个改动应该在另一个分支上。
于是问题来了:
当前分支已经改了文件,但我 不想在当前分支提交,
而是想 把这些改动提交到新分支。
如果处理不好,很容易出现:
老分支被污染
commit历史混乱
不小心push到错误分支
下面把这一整套 Git 实战方法系统整理一下。
理解一个最重要的Git原理
很多人误以为:
修改是属于某个分支的。
其实不是。
Git里有三个区域:
工作区(Working Directory)
暂存区(Index / Stage)
提交区(Commit / Repository)
你改文件时,其实只是:
修改在工作区里
而不是属于某个分支。
所以只要你还没 commit,
切换分支时修改是可以一起带过去的。
这正是解决问题的关键。
第一种情况:只是修改文件,还没有 commit
这是最简单、最干净的情况。
假设当前在:
main
你修改了一个文件:
test.php
但你突然发现,这个修改应该属于:
feature-login
这时直接创建并切换分支:
git checkout -b feature-login
或者远程已经存在:
git checkout --track origin/feature-login
这时你会发现:
你的修改 还在工作区里。
然后正常提交:
git add test.php git commit -m "fix login bug"
最终结果:
feature-login 有提交
main 完全没有记录
这是 最推荐的做法。
第二种情况:Git不允许切分支
有时候Git会提示:
Your local changes would be overwritten by checkout
原因通常是:
目标分支和当前分支在同一文件有冲突。
这时需要用 stash 暂存修改。
步骤如下。
先临时保存修改:
git stash
切换到新分支:
git checkout --track origin/feature-login
恢复修改:
git stash pop
然后正常提交:
git add . git commit -m "fix login bug"
这样:
修改仍然只存在于新分支。
第三种情况:已经 commit 了,但发现分支错了
假设你已经做了:
git commit -m "fix login bug"
但后来发现:
这个提交应该在新分支。
解决方法非常简单。
第一步:创建新分支
git checkout -b feature-login
因为分支是从当前提交创建的,所以:
commit 会自动带过去。
第二步:回到旧分支
git checkout main
第三步:撤销提交
git reset --hard HEAD~1
结果:
feature-login 保留提交
main 没有提交
第四部分:远程新分支的正确切换方式
很多时候团队成员会 push 新分支,你本地没有。
先更新远程信息:
git fetch
查看远程分支:
git branch -r
如果看到:
origin/feature-login
创建本地分支并跟踪:
git checkout --track origin/feature-login
Git会自动:
创建本地分支
建立 tracking 关系
切换到该分支
等价写法是:
git checkout -b feature-login origin/feature-login
Git 2.23以后推荐使用:
git switch --track origin/feature-login
查看分支追踪关系:
git branch -vv
会看到:
feature-login [origin/feature-login]
说明已建立跟踪。
第五部分:开发中最常见的正确姿势
现实开发里,经常是这样:
你在 main 上改了代码
改到一半发现分支不对
正确做法:
直接:
git checkout -b feature-login
Git会把你当前修改一起带过去。
然后提交:
git add . git commit -m "xxx"
整个过程:
main 不受影响
feature-login 有提交
非常干净。
第六部分:一套万能操作口诀
记住这几句话,基本不会再犯错。
改错分支但没提交:
git checkout -b 新分支
改错分支已提交:
git checkout -b 新分支 git checkout 老分支 git reset --hard HEAD~1
切远程新分支:
git fetch git checkout --track origin/xxx
Git不让切分支:
git stash git checkout 新分支 git stash pop
总结一句话
Git的修改属于工作区,不属于分支。
所以只要你没 commit:
改动可以随分支一起移动。
这也是 Git 分支模型如此强大的根本原因。
发表评论: