一、git pull --rebase 作用解析
适用场景:当本地分支和远程分支出现分叉时,需要将本地修改合并到最新远程代码
执行效果:
- 先将本地未推送的提交暂存(临时保存)
- 拉取远程最新代码
- 将暂存的本地提交重新应用到最新远程代码之上
示例流程:
# 原始提交历史
A---B---C origin/main
\
D---E local/main
# 执行后效果
A---B---C---D'---E' local/main
(origin/main)
注意事项:
- 可能需手动解决冲突
- 会改写本地提交历史
- 不要对已推送的公共分支使用
二、git reset --soft origin/分支名 作用解析
适用场景:需要撤销本地提交但保留修改内容
执行效果:
- 将本地分支指针重置到远程分支的最新提交
- 保留所有本地修改在暂存区(即git add后的状态)
- 不改变工作目录文件内容
示例流程:
# 执行前状态
本地提交:A---B---C
远程提交:A---B
# 执行命令后
本地指针回到B,C提交的修改保留在暂存区
典型使用场景:
- 合并多个提交为一个
- 修改最近提交的提交信息
- 撤销错误的提交但保留代码修改
三、组合使用场景
常见工作流:
# 1. 同步最新代码(使用rebase保持提交线性)
git pull --rebase origin main
# 2. 撤销本地所有未推送的提交(但保留代码修改)
git reset --soft origin/main
# 3. 重新整理代码后提交
git add .
git commit -m "整理后的提交"
效果对比:
原始提交历史:
本地:A---B---C---D
远程:A---B---X---Y
执行后:
本地:A---B---X---Y---[新提交]
四、注意事项对比表
| 命令 | 危险程度 | 影响范围 | 推荐使用场景 |
|---|---|---|---|
git pull --rebase | 中 | 本地提交历史 | 个人分支开发 |
git reset --soft | 低 | 本地未推送提交 | 提交整理/修改提交信息 |
五、可视化操作演示
假设当前状态:
本地提交:A---B---C
远程提交:A---D---E
执行顺序:
1. git pull --rebase
本地变为:A---D---E---B'---C'
2. git reset --soft origin/main
本地变为:A---D---E(B,C的修改在暂存区)
此时可以:
- 重新git add选择要提交的文件
- 用git commit重新生成干净的提交
- 最终推送整洁的历史记录
建议在个人分支或功能分支使用这些命令,公共分支慎用历史改写操作。