Git 高级操作:rebase、cherry-pick、stash
掌握 Git 的基础命令只是第一步,要想在团队协作和个人开发中游刃有余,必须熟练使用高级操作。这些工具能帮你保持提交历史的整洁、精确迁移代码以及灵活处理多任务切换。
Git Rebase:整理提交历史
Rebase(变基)最常用的场景是将在一个分支上开发的提交“移动”到另一个分支的最新提交之上,或者将多个杂乱的提交压缩成一个。这能避免分叉的合并记录,让项目历史像一条直线般清晰。
以下是将 feature 分支变基到 main 分支,并压缩最近 3 个提交的步骤:
-
切换到你的功能分支:
在终端中执行以下命令。git checkout feature -
拉取最新的远程主分支代码:
确保你的本地主分支是最新的,减少冲突。git fetch origin main -
执行交互式变基:
使用-i参数开启交互模式,HEAD~3表示最近 3 次提交。git rebase -i HEAD~3 -
编辑提交清单:
执行命令后,会弹出一个编辑器窗口(通常是 Vim 或 Nano)。你会看到类似下面的列表:pick a1b2c3d 提交信息 1 pick d4e5f6g 提交信息 2 pick h7i8j9k 提交信息 3- 将除了第一行外的所有
pick修改为squash(或简写为s)。 - 这意味着将第 2 和第 3 个提交合并到第 1 个中。
- 将除了第一行外的所有
-
保存并退出编辑器:
在 Vim 中按Esc,输入:wq并回车。 -
修改合并后的提交信息:
Git 会再次弹出编辑器,让你为这个新的、大块的提交写一个新的描述。删除旧的提交信息,输入新的描述,然后保存退出。 -
强制推送到远程分支:
因为变基改变了历史,必须使用强制推送。git push origin feature --force
变基原理图示
变基的本质是提取提交中的修改,并在新的基础上重新应用。
Git Cherry-pick:精确移植提交
当你只想将某个分支上的“某一个特定提交”应用到当前分支,而不想合并整个分支时,使用 Cherry-pick(拣选)。
假设你的 hotfix 分支有一个修复 Bug 的提交,你想把它拿到 feature 分支上来:
-
切换到目标分支:
即你想把代码应用到的那个分支。git checkout feature -
查找想要拣选的提交哈希值:
去hotfix分支查看日志,复制那一长串 SHA-1 码(如8f5a2c1)。git log hotfix -
执行拣选命令:
将刚才复制的哈希值填入命令中。git cherry-pick 8f5a2c1 -
处理可能出现的冲突:
- 如果 Git 提示冲突,打开冲突文件。
- 修改代码,保留你需要的部分,删除冲突标记(
<<<<<<<,=======,>>>>>>>)。 - 添加修改后的文件。
git add . -
继续拣选过程:
使用--continue参数完成操作。git cherry-pick --continue -
推送代码:
如果是远程分支,正常推送即可。
Git Stash:暂存工作现场
当你正在开发功能,突然需要切换分支去修复一个紧急 Bug,但当前代码还没写完不能提交时,Stash(暂存)是最佳选择。它能将当前工作区的修改“藏”起来,让工作区变干净。
基本操作流程
-
暂存当前修改:
执行此命令后,你的工作区会回到上一次提交的状态,所有未提交的修改都被保存到了栈中。git stash如果想顺便把未跟踪的文件(新文件)也存起来,使用:
git stash -u -
切换分支去处理其他事务:
现在你可以随意git checkout其他分支,不会被当前未完成的代码阻挡。 -
恢复暂存的修改:
当你处理完紧急事务回到原分支后,执行以下命令将修改取回。git stash poppop命令会在恢复后自动删除栈中的那条记录。如果想保留记录,仅应用修改,可以用git stash apply。
常用 Stash 管理命令
下表列出了管理暂存栈的常用指令:
| 操作 | 命令 | 说明 |
|---|---|---|
| 查看列表 | git stash list |
显示所有暂存记录,stash@{0} 是最新的 |
| 应用指定 | git stash apply stash@{n} |
恢复第 n 条记录,但不删除它 |
| 删除指定 | git stash drop stash@{n} |
删除第 n 条记录 |
| 清空全部 | git stash clear |
慎用,直接删除所有暂存记录 |

暂无评论,快来抢沙发吧!