在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
- 将当前更改保存到临时stash:
- 基于该stash创建新分支并切换到新分支:
1
| git stash branch <new-branch> stash@{0}
|
移动已提交的工作到新分支
如果在主分支上已经进行了一些提交,但现在想将这些提交移动到不同的分支,可以按以下步骤操作:
- 将当前历史复制到新分支,同时带上未提交的更改:
1
| git checkout -b <new-feature-branch>
|
- 强制将原始分支回滚:
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 switch -c <new-branch>
git checkout -b <new-branch>
|
使用stash保存和恢复更改
1 2 3 4 5 6
| git stash
git stash branch <new-branch> stash@{0}
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
| 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
之前对索引进行了更改并提交,可能会导致合并问题,此时可以直接提交更改。