在Git中将现有未提交的工作转移到新分支

在Git中将现有未提交的工作转移到新分支

技术背景

在使用Git进行版本控制时,有时会在错误的分支上进行了一些工作,或者开始工作时忘记创建新分支。这时,就需要将这些未提交的工作转移到新的分支上,以保持代码仓库的整洁和开发流程的规范。

实现步骤

Git 2.23及以上版本

从Git 2.23版本开始,引入了新的switch子命令,可用于替代checkout进行分支切换。使用以下命令可以创建并切换到新分支,同时保留未提交的更改:

1
git switch -c <new-branch>

Git 2.23之前版本

在Git 2.23之前的版本,使用checkout命令创建并切换到新分支:

1
git checkout -b <new-branch>

之后,可以将文件更改暂存并提交到新分支:

1
2
git add <files>
git commit -m "<Brief description of this commit>"

另一种方法:使用stash

  1. 将当前更改保存到临时stash:
1
git stash
  1. 基于该stash创建新分支并切换到新分支:
1
git stash branch <new-branch> stash@{0}

移动已提交的工作到新分支

如果在主分支上已经进行了一些提交,但现在想将这些提交移动到不同的分支,可以按以下步骤操作:

  1. 将当前历史复制到新分支,同时带上未提交的更改:
1
git checkout -b <new-feature-branch>
  1. 强制将原始分支回滚:
1
git branch -f <previous-branch> <earlier-commit-id>

常见场景示例

假设忘记为新功能创建新分支,在旧功能分支上进行了所有工作,并且已将所有“旧”工作提交到主分支,现在希望新分支从“主分支”开始。可以按以下步骤操作:

1
2
3
4
git stash 
git checkout master
git checkout -b "New_branch"
git stash apply

核心代码

创建并切换到新分支

1
2
3
4
# Git 2.23及以上
git switch -c <new-branch>
# Git 2.23之前
git checkout -b <new-branch>

使用stash保存和恢复更改

1
2
3
4
5
6
# 保存更改到stash
git stash
# 基于stash创建新分支
git stash branch <new-branch> stash@{0}
# 恢复stash中的更改
git stash apply

移动已提交的工作

1
2
3
4
# 创建新分支
git checkout -b <new-feature-branch>
# 强制回滚原始分支
git branch -f <previous-branch> <earlier-commit-id>

最佳实践

  • 使用bash别名:可以创建bash别名来简化操作,例如:
1
2
3
4
5
6
7
8
9
10
# 在~/.bash_profile中添加以下内容
gitco ()
{
git stash && git checkout $1 && git stash apply
}

gitconew ()
{
git stash && git checkout master && git checkout -b $1 && git checkout -b $1 && git stash apply
}

然后运行source ~/.bash_profile重新加载配置文件。

  • 使用工具辅助:可以使用GitHub Desktop、Visual Studio Community、TortoiseGIT、SourceTree等工具来完成分支切换和更改转移的操作。

常见问题

  • git branch -f会重置跟踪信息git branch -f master origin/master会重置该分支的跟踪信息,如果之前配置了master分支推送到其他位置,该配置将丢失。
  • 分支后进行变基可能导致提交丢失:如果在分支后进行变基,可能会导致一些提交丢失,可以使用cherry-pick创建新的历史来避免。
  • git stash pop合并问题:如果在git stash pop之前对索引进行了更改并提交,可能会导致合并问题,此时可以直接提交更改。

在Git中将现有未提交的工作转移到新分支
https://119291.xyz/posts/2025-05-09.move-existing-uncommitted-work-to-new-branch-in-git/
作者
ww
发布于
2025年5月9日
许可协议