1. 概述

Git 是目前最流行的版本控制系统之一。

本文将介绍如何将当前分支中尚未提交的修改转移到一个新的分支上,同时保持原分支(比如 master)不变。这个场景在日常开发中非常常见,比如我们误操作在 master 分支上做了修改,却发现应该在一个功能分支上完成这些工作。

2. 场景说明

通常我们在开发一个新功能时,会遵循如下流程:

  1. 创建一个新分支,例如 feature
  2. 在该分支上进行开发并提交
  3. 推送到远程仓库并发起 Pull Request
  4. 审核通过后合并到主分支(如 masterrelease

但有时候,我们可能在开始开发前忘记切换分支,直接在 master 上做了修改。此时如果直接提交,会污染主分支。为避免这种情况,我们需要:

✅ 创建一个新分支
✅ 将当前未提交的修改移动到新分支
✅ 保持原分支干净无改动

举个例子,我们有一个仓库 myRepo,当前在 master 分支,并且工作区有未提交的改动:

$ git branch
* master

$ git status
On branch master
Changes not staged for commit:
  modified:   Readme.md

Untracked files:
  a-new-file.txt

我们希望将这些改动转移到一个新的 feature1 分支上,而不是留在 master

3. 使用 git checkout -b 创建新分支并切换

Git 提供了 git checkout -b <branch-name> 命令,用于创建并切换到新分支。这个命令的特点是:

✅ 会保留当前所有未提交的修改
✅ 不会对原分支造成影响

操作示例如下:

$ git checkout -b feature1
Switched to a new branch 'feature1'

$ git status
On branch feature1
Changes not staged for commit:
  modified:   Readme.md

Untracked files:
  a-new-file.txt

可以看到,所有未提交的改动都已转移到 feature1 分支。接下来我们可以提交这些改动:

$ git add . && git commit -m 'implemented feature1'

切换回 master 后验证原分支是否干净:

$ git checkout master
$ git status
On branch master
nothing to commit, working tree clean

✅ 原分支未被修改,改动已成功转移至新分支。

4. 使用 git switch -C 创建并切换分支(推荐)

从 Git 2.23 开始,官方引入了 git switch 命令,用于替代部分 checkout 的功能,语义更清晰,避免命令重载。

其中 -C 选项用于创建新分支并切换过去,效果与 git checkout -b 类似:

$ git switch -C feature2
Switched to a new branch 'feature2'

此时当前所有未提交的改动也会被带到新分支上。例如我们删除了 Readme.md 并新增了 ReadmeNew.md

$ git status
On branch feature2
Changes not staged for commit:
  deleted:    Readme.md

Untracked files:
  ReadmeNew.md

提交改动后,切换回 master 验证:

$ git switch master
Switched to branch 'master'

$ git status
On branch master
nothing to commit, working tree clean

$ ls -l Readme.md
-rw-r--r-- 1 user staff 0 Jan 1 00:00 Readme.md

✅ 原分支内容完整保留,未被修改。

5. 总结

当我们误在错误分支(如 master)上做了修改时,可以通过以下两个命令将改动转移到新分支:

方法 命令 说明
✅ 推荐 git switch -C <new-branch> Git 2.23+ 推荐使用,语义清晰
✅ 传统方式 git checkout -b <new-branch> 老版本 Git 通用命令

两种方式都能保留当前所有未提交的改动,并将其带到新分支,同时保持原分支干净无改动。选择哪种方式取决于你使用的 Git 版本和偏好。

⚠️ 踩坑提醒:不要使用 git stash 然后再 apply 的方式来转移改动,除非你特别清楚自己在做什么。这种方式容易导致冲突或丢失改动,增加操作复杂度。


原始标题:Move Existing, Uncommitted Work to a New Branch in Git