Git 是最风行的代码版本控制系统,这一系列文章介绍了一些 Git 的高阶应用形式,从而帮忙咱们能够更好的利用 Git 的能力。本系列一共 8 篇文章,这是第 6 篇。原文:Interactive Rebase: Clean up your Commit History[1]
交互式 Rebase 是 Git 命令中的瑞士军刀,有很多用例和可能性,对任何开发人员的工具链都是极好的补充,容许咱们在与团队成员分享工作之前批改本地提交历史。
咱们看看应用交互式 rebase 能够做些什么,而后看一些理论的例子。
Git 进阶系列:
- 创立完满的提交
- Git 中的分支策略
- 基于 Pull Request 实现更好的合作
- 合并抵触
- Rebase vs Merge
- 交互式 Rebase(本文)
- Git 中的 Cherry-pick 提交
- 用 Reflog 复原失落的提交
重写提交历史
简而言之,交互式 rebase 容许操作、优化和清理提交历史。你能够…
- 批改提交信息
- 合并多个提交
- 拆分、编辑已有提交
- 对提交重排序
- 删除提交
请记住,交互式 rebase 会重写提交历史,所有波及的提交都将取得新的哈希 ID。另外,简略揭示一下: 提交 id 是用于辨认提交的,是 SHA- 1 校验和。因而,通过扭转哈希,在技术上来说咱们创立了全新的提交。这意味着不应该在曾经推送到共享远端代码库的上应用交互式 rebase。其余团队成员的工作可能就基于这些提交,当咱们应用交互式 rebase 重写提交历史时,就扭转了这些根底提交。
所有这些都意味着交互式的 rebase 是为了帮忙咱们在合并 (并可能推入) 到共享的团队分支之前清理和优化本人的本地提交历史。
交互式 rebase 工作流
在咱们进行交互式 rebase 测试之前,先看看个别的工作流。无论做什么,删除提交、更改提交音讯、合并提交……这些步骤都是雷同的。
第一步是确定要操作的提交的范畴,想回到多久以前?一旦有了答案,就能够开始交互式 rebase 会话了。在这里,咱们有机会编辑提交历史,比方说能够通过从新排序、删除、组合提交等形式操作所抉择的提交。
在第一步中,总是要通过查看提交历史记录理解以后状态,能够应用 git log
命令来查看我的项目的历史并显示提交日志。
上面是本文应用的示例代码库:
查看完后,就能够开始工作了。咱们一步一步来,在示例中,咱们将做以下事件:
- 首先,批改旧的提交信息。
- 其次,合并两个旧的提交。
- 而后,合成一个提交。
- 最初,删除一个提交。
批改提交信息
许多状况下,咱们心愿更改最近的提交。请记住,这个场景中有一个不波及交互式 rebase 的捷径:
$ git commit --amend
这个命令会关上默认的文本编辑器,能够批改最近提交的内容和信息。咱们能够更改、保留并退出编辑器。该操作不仅能够更新提交信息,还会无效的更改提交自身并编写一个新的提交。
如果曾经将上次提交的文件推送到远端代码库,同样请小心,不要批改它!
对于任何其余提交 (任何比最近一次更早的提交),都必须执行交互式 rebase。要交互式运行git rebase
,须要增加-i
选项。
第一步是确定根底提交: 要更改的提交的父提交。能够通过应用提交的哈希 ID 或执行大量计数来实现这一点。要更改最初三个提交(或者至多其中一个),能够这样定义父提交:
$ git rebase -i HEAD~3
该命令会关上一个编辑器窗口,能够看到所抉择的三个提交 (我说的“抉择”是指提交的范畴: 从HEAD
始终到 HEAD~3
)。和git log
不一样,这个编辑器将最老的提交 (HEAD~3
) 显示在顶部,最新的在底部。
在这个窗口中,实际上并不需要更改提交,只需通知 Git 要执行哪种操作。Git 为此提供了一系列关键字,在咱们的示例中,将单词 pick
更改为reword
,这容许咱们更改提交信息。保留并敞开编辑器后,Git 将显示并容许更改理论的提交信息。保留并再次退出,就这样!
合并提交
下一个示例,咱们将两个提交(“7b2317cf Change the page structure”和“6bcf266 Optimize markup”)合并成一个提交。同样,第一步须要确定根底提交。咱们至多须要回到父提交:
$ git rebase -i HEAD~3
编辑器窗口再次关上,但这次咱们输出的不是 reword
,而是squash
。确切地说,咱们在第 2 行中将pick
替换为 squash
,以便将其与第 1 行合并。记住这一点很重要: squash
关键字会将标记的行与它下面的行合并起来!
保留更改并敞开窗口后,将弹出一个新的编辑器窗口。为什么?因为通过合并两个提交,咱们创立了一个新的提交!而这个新的提交须要一条提交信息。输出信息,保留并敞开窗口……这样就胜利合并了两次提交。如许弱小!
最初,给那些应用“Tower”Git 桌面 GUI 的人一点“业余提醒”: 为了执行 squash,能够简略的在提交视图中相互拖放提交。如果想要更改提交信息,只需右键单击问题中的提交,并从上下文菜单中选择“Edit commit message”即可。
删除提交
最初的例子将介绍一个大家伙: 从提交历史中删除一个订正!为此,咱们应用 drop 关键字来标记想要删除的提交:
drop 0023cdd Add simple robots.txt
pick 2b504be Change headlines for about and imprint
pick 6bcf266 Optimizes markup structure in index page
这可能是一个很好的机会来答复一个你可能曾经思考了一段时间的问题: 如果正在进行 rebase 操作,并认为“哦,不,这不是一个好主见”,你能做什么?没有问题,能够随时停止!只需输出以下命令,代码库就会回到 rebase 之前的状态:
$ git rebase --abort
扭转历史
这些只是交互式 rebase 所能做的一些例子,还有很多其余办法能够管制和批改本地提交历史记录。
如果想更深刻理解高级 Git 工具,能够收费查看“Advanced Git Kit[3]”: 这是对于分支策略、交互式 Rebase、Reflog、子模块等主题的短视频汇合。
References: \
[1] Interactive Rebase: Clean up your Commit History: https://css-tricks.com/interactive-rebase-clean-up-your-commi…你好,我是俞凡,在 Motorola 做过研发,当初在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓重的趣味,平时喜爱浏览、思考,置信继续学习、一生成长,欢送一起交流学习。\
微信公众号:DeepNoMind
本文由 mdnice 多平台公布