文章目录

Git 高级操作:rebase、cherry-pick、stash

发布于 2026-04-17 14:21:32 · 浏览 21 次 · 评论 0 条

Git 高级操作:rebase、cherry-pick、stash

掌握 Git 的基础命令只是第一步,要想在团队协作和个人开发中游刃有余,必须熟练使用高级操作。这些工具能帮你保持提交历史的整洁、精确迁移代码以及灵活处理多任务切换。


Git Rebase:整理提交历史

Rebase(变基)最常用的场景是将在一个分支上开发的提交“移动”到另一个分支的最新提交之上,或者将多个杂乱的提交压缩成一个。这能避免分叉的合并记录,让项目历史像一条直线般清晰。

以下是将 feature 分支变基到 main 分支,并压缩最近 3 个提交的步骤:

  1. 切换到你的功能分支:
    在终端中执行以下命令。

    git checkout feature
  2. 拉取最新的远程主分支代码:
    确保你的本地主分支是最新的,减少冲突。

    git fetch origin main
  3. 执行交互式变基:
    使用 -i 参数开启交互模式,HEAD~3 表示最近 3 次提交。

    git rebase -i HEAD~3
  4. 编辑提交清单:
    执行命令后,会弹出一个编辑器窗口(通常是 Vim 或 Nano)。你会看到类似下面的列表:

    pick a1b2c3d 提交信息 1
    pick d4e5f6g 提交信息 2
    pick h7i8j9k 提交信息 3
    • 将除了第一行外的所有 pick 修改squash(或简写为 s)。
    • 这意味着将第 2 和第 3 个提交合并到第 1 个中。
  5. 保存并退出编辑器:
    在 Vim 中按 Esc,输入 :wq 并回车。

  6. 修改合并后的提交信息:
    Git 会再次弹出编辑器,让你为这个新的、大块的提交写一个新的描述。删除旧的提交信息,输入新的描述,然后保存退出。

  7. 强制推送到远程分支:
    因为变基改变了历史,必须使用强制推送。

    git push origin feature --force

变基原理图示

变基的本质是提取提交中的修改,并在新的基础上重新应用。

graph LR subgraph Before["变基前"] A1[("主分支: 提交 A")] B1[("主分支: 提交 B")] C1[("功能: 提交 C")] D1[("功能: 提交 D")] A1 --> B1 A1 --> C1 C1 --> D1 end subgraph After["变基后"] A2[("主分支: 提交 A")] B2[("主分支: 提交 B")] C2[("功能: 提交 C'")] D2[("功能: 提交 D'")] A2 --> B2 B2 --> C2 C2 --> D2 end B1 --"变基目标"--> B2

Git Cherry-pick:精确移植提交

当你只想将某个分支上的“某一个特定提交”应用到当前分支,而不想合并整个分支时,使用 Cherry-pick(拣选)。

假设你的 hotfix 分支有一个修复 Bug 的提交,你想把它拿到 feature 分支上来:

  1. 切换到目标分支:
    即你想把代码应用到的那个分支。

    git checkout feature
  2. 查找想要拣选的提交哈希值:
    hotfix 分支查看日志,复制那一长串 SHA-1 码(如 8f5a2c1)。

    git log hotfix
  3. 执行拣选命令:
    将刚才复制的哈希值填入命令中。

    git cherry-pick 8f5a2c1
  4. 处理可能出现的冲突:

    • 如果 Git 提示冲突,打开冲突文件。
    • 修改代码,保留你需要的部分,删除冲突标记(<<<<<<<, =======, >>>>>>>)。
    • 添加修改后的文件。
    git add .
  5. 继续拣选过程:
    使用 --continue 参数完成操作。

    git cherry-pick --continue
  6. 推送代码:
    如果是远程分支,正常推送即可。


Git Stash:暂存工作现场

当你正在开发功能,突然需要切换分支去修复一个紧急 Bug,但当前代码还没写完不能提交时,Stash(暂存)是最佳选择。它能将当前工作区的修改“藏”起来,让工作区变干净。

基本操作流程

  1. 暂存当前修改:
    执行此命令后,你的工作区会回到上一次提交的状态,所有未提交的修改都被保存到了栈中。

    git stash

    如果想顺便把未跟踪的文件(新文件)也存起来,使用:

    git stash -u
  2. 切换分支去处理其他事务:
    现在你可以随意 git checkout 其他分支,不会被当前未完成的代码阻挡。

  3. 恢复暂存的修改:
    当你处理完紧急事务回到原分支后,执行以下命令将修改取回。

    git stash pop

    pop 命令会在恢复后自动删除栈中的那条记录。如果想保留记录,仅应用修改,可以用 git stash apply

常用 Stash 管理命令

下表列出了管理暂存栈的常用指令:

操作 命令 说明
查看列表 git stash list 显示所有暂存记录,stash@{0} 是最新的
应用指定 git stash apply stash@{n} 恢复第 n 条记录,但不删除它
删除指定 git stash drop stash@{n} 删除第 n 条记录
清空全部 git stash clear 慎用,直接删除所有暂存记录

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文