Git 交互式变基与分支 Rebase 操作指南
一、Git 交互式变基操作(以最近 5 次提交为例)
目标
通过 git rebase -i HEAD~5
命令对最近 5 次提交进行以下操作之一:
- 合并多个提交
- 修改提交信息
- 删除不需要的提交
- 重新排序提交顺序
操作流程概览
步骤 | 操作 |
---|---|
Step 1 | 执行命令进入交互式变基界面 |
Step 2 | 在编辑器中选择每个提交的操作 |
Step 3 | 保存并退出编辑器 |
Step 4 | 如需修改提交信息或内容,继续操作 |
Step 5 | 完成变基后推送更新 |
Step 1: 执行命令进入交互式变基界面
在终端运行:
git rebase -i HEAD~5
这会打开一个临时文件,列出最近的 5 条提交记录,如下所示:
pick abc1234 feat: add feature A
pick def5678 fix: bug in feature A
pick ghi9012 docs: update README
pick jkl0123 style: format code
pick mno4567 chore: clean up
# 命令说明:
# p, pick = 使用该提交
# r, reword = 修改提交信息
# e, edit = 修改提交内容
# s, squash = 合并到前一个提交
# f, fixup = 类似 squash,但丢弃提交信息
# d, drop = 删除该提交
Step 2: 编辑提交操作方式
你可以根据需要修改每行前面的 pick
字段。例如:
示例:合并前两个提交
pick abc1234 feat: add feature A
squash def5678 fix: bug in feature A
pick ghi9012 docs: update README
pick jkl0123 style: format code
pick mno4567 chore: clean up
示例:修改第一个提交的信息
reword abc1234 feat: add feature A
pick def5678 fix: bug in feature A
...
示例:删除最后一次提交
pick abc1234 feat: add feature A
pick def5678 fix: bug in feature A
pick ghi9012 docs: update README
pick jkl0123 style: format code
drop mno4567 chore: clean up
Step 3: 保存并退出编辑器
如果你使用的是 Vim:
- 按
Esc
- 输入
:wq
并回车
- 按
如果你使用的是 VS Code 或其他编辑器:
- 直接保存并关闭文件
Step 4: 修改合并后的提交信息(如使用了 squash
)
Git 会再次弹出编辑器窗口,显示所有被合并提交的信息:
# This is a combination of 2 commits.
# This is the 1st commit message:
feat: add feature A
# This is the commit message #2:
fix: bug in feature A
你可以将其修改为:
feat: add user login flow
然后保存并退出。
Step 5: 完成变基并推送更新
运行以下命令完成变基:
git rebase --continue
如果你没有更多冲突或修改,则可以将更新推送到远程分支:
git push origin dengping_dev --force
⚠️ 注意:由于你修改了提交历史,必须使用 --force
推送。
二、Git 从 master 分支 rebase 到 dev 分支的操作指南
目标
将当前分支(例如 dev
)基于远程的 master
分支进行变基,以确保你的本地提交历史是建立在最新的 master
提交之上。
操作流程概览
步骤 | 操作 |
---|---|
Step 1 | 确保工作区干净 |
Step 2 | 获取远程最新提交 |
Step 3 | 切换到目标分支(如 dev ) |
Step 4 | 执行 git rebase master 命令 |
Step 5 | 解决冲突(如有) |
Step 6 | 完成变基并推送更新 |
Step 1: 确保工作区干净
在执行 rebase 前,请确保你的工作目录中没有未提交的更改。你可以通过以下命令查看状态:
git status
如果存在修改但未提交的内容,可以选择提交或暂存它们:
git add .
git commit -m "Save current changes"
或者使用 git stash
暂存更改:
git stash
Step 2: 获取远程最新提交
确保你拥有远程仓库的最新内容:
git fetch origin
这将拉取远程所有分支的最新信息,包括 master
。
Step 3: 切换到目标分支(如 dev
)
切换到你想 rebase 的目标分支,例如 dev
:
git checkout dev
Step 4: 执行 git rebase master
命令
运行以下命令,将 dev
分支基于 master
进行变基:
git rebase master
Git 将尝试自动将 dev
分支上的提交重新应用在 master
的最新提交之后。
Step 5: 解决冲突(如有)
如果在 rebase 过程中出现冲突,Git 会暂停变基并在冲突文件中标记冲突部分。
冲突示例:
<<<<<<< HEAD
# master 上的内容
=======
# dev 分支上的内容
>>>>>>> abc1234... commit message
处理步骤:
- 打开提示冲突的文件,手动解决冲突。
- 标记冲突已解决:
git add <filename>
- 继续变基过程:
git rebase --continue
重复此过程直到所有冲突解决完毕。
Step 6: 完成变基并推送更新
当变基完成后,你可以将更新后的提交推送到远程仓库:
git push origin dev --force
⚠️ 注意:由于 rebase 改变了提交历史,因此需要使用 --force
强制推送。
总结
- 适用场景:当你希望将本地分支的更改基于最新的
master
分支时,可以使用git rebase master
。 - 注意事项:避免对已经推送到远程的公共分支进行 rebase,以免影响其他开发者的工作。
- 优势:保持提交历史线性清晰,避免合并提交带来的混乱。