Git 交互式变基
Git 变基(Rebase)是一种将一个分支上的一系列提交重新应用到另一个分支上的操作。通过变基,开发者可以清理和整理历史,使提交历史更加线性和清晰。
什么是变基?
举个通俗的例子,假设你有两个分支:main
和 feature
。feature
分支基于 main
分支创建,并且你在 feature
分支上做了一些提交。与此同时,main
分支上也有新的提交。
main: A---B---C
\
feature: D---E---F
在上面的例子中:
A
,B
,C
是main
分支上的提交。D
,E
,F
是feature
分支上的提交。
现在,你想把 feature
分支的更改合并到 main
分支中。但是,你希望提交历史看起来更“线性”,就像是 feature
分支上的更改是直接基于 main
分支上的最新提交 C
之上的。
这时,可以使用变基操作:
git checkout feature
git rebase main
变基操作会做以下事情:
- 找到共同的祖先:Git 找到
feature
和main
分支的共同祖先提交(在这个例子中是B
)。 - 存储当前分支的更改:Git 暂时存储
feature
分支上的提交D
,E
,F
。 - 移动分支指针:Git 将
feature
分支指针移动到main
分支的最新提交C
。 - 逐个应用更改:Git 将
D
,E
,F
逐个应用到C
之上。
变基后的提交历史看起来像这样:
main: A---B---C
\
feature: D'---E'---F'
D'
,E'
,F'
是新的提交,它们的内容与D
,E
,F
相同,但现在是基于C
之上的。
这样,feature
分支上的提交历史变得更加线性,看起来像是 D
, E
, F
是直接基于 C
开发的。
使用场景
- 清理历史:当你想要一个干净、线性的提交历史时,可以使用变基。例如,当你在一个特性分支上工作,想要将这个分支的更改合并到主分支上,但又不想在主分支上增加额外的合并提交。
- 准备代码提交:在将你的代码推送到远程仓库之前,你可能想要通过变基来清理你的提交记录,使其更加清晰。
- 团队协作:在团队协作中,变基可以避免不必要的合并提交,保持项目的提交历史整洁。
交互式变基
交互式变基(Interactive Rebase)是变基的一种强大模式,允许你在变基过程中对每个提交进行编辑、重排、合并或删除。
基本操作步骤
1、启动交互式变基
git rebase -i <共同祖先的哈希值> feature
例如,假设你在 feature
分支上,想要将其变基到 main
分支:
git rebase -i main
2、编辑提交列表
这会打开一个文本编辑器,显示当前分支相对于目标分支的所有提交。你可以在这里对提交进行操作:
pick f1e2d3c 添加功能 A
pick a3b4c5d 修复 bug
pick b6c7d8e 更新文档
你可以将 pick
改为以下命令:
reword
:修改提交信息edit
:停下来允许你修改提交内容squash
:将该提交与前一个提交合并fixup
:类似squash
,但会丢弃该提交的提交信息
3、保存并退出 编辑完成后,保存并退出编辑器。Git 会按顺序应用这些修改。
4、解决冲突 如果在应用提交时遇到冲突,Git 会暂停并允许你手动解决冲突。解决冲突后,使用以下命令继续变基:
git add <解决冲突的文件>
git rebase --continue
如果你想中止变基,可以使用:
git rebase --abort
5、完成变基 一旦所有提交都被成功应用,变基过程就完成了。你的提交历史现在已经被整理得更加清晰和线性。
注意事项
- 不要对已推送到远程仓库的分支进行变基:变基会重写历史,这可能会导致其他开发者的工作出现问题。
- 变基是不可逆的:一旦执行了变基操作,原始的提交历史就会被覆盖,除非有备份。
- 谨慎使用变基:变基是一个强大的工具,但也需要谨慎使用。正确使用变基可以极大地提高代码管理的效率和清晰度。
通过交互式变基,你可以更好地管理你的提交历史,确保代码库的整洁。