无尘阁日记

无尘阁日记

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 分支模型如此强大的根本原因。