git两个命令助你有个干净的提交历史

1,105 阅读2分钟

一、git pull --rebase 作用解析

适用场景:当本地分支和远程分支出现分叉时,需要将本地修改合并到最新远程代码

执行效果

  1. 先将本地未推送的提交暂存(临时保存)
  2. 拉取远程最新代码
  3. 将暂存的本地提交重新应用到最新远程代码之上

示例流程

# 原始提交历史
A---B---C origin/main
     \
      D---E local/main

# 执行后效果
A---B---C---D'---E' local/main
           (origin/main)

注意事项

  • 可能需手动解决冲突
  • 会改写本地提交历史
  • 不要对已推送的公共分支使用

二、git reset --soft origin/分支名 作用解析

适用场景:需要撤销本地提交但保留修改内容

执行效果

  1. 将本地分支指针重置到远程分支的最新提交
  2. 保留所有本地修改在暂存区(即git add后的状态)
  3. 不改变工作目录文件内容

示例流程

# 执行前状态
本地提交: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重新生成干净的提交
  • 最终推送整洁的历史记录

建议在个人分支或功能分支使用这些命令,公共分支慎用历史改写操作。