我的 Git rebase -i 理解指南

git rebase 命令是 Git 中最强大的命令之一。它可以重写你仓库的提交历史,通过重新排列、修改甚至删除提交。
6 位读者喜欢这篇文章。
Why and how to handle exceptions in Python Flask

图片来自 Unsplash.com,知识共享零协议 

Git 是一个免费且开源的分布式版本控制系统,旨在处理从小型到非常大型的各种项目,并兼顾速度和效率。它是开源开发人员工具包中必不可少的工具。

本文介绍了为什么以及如何使用 git rebase --interactive(简写为 -i)命令。这被认为是中级 Git 命令,但是一旦你开始与大型团队合作,它就会非常有用。

此命令是 Git 中最强大的命令之一。git rebase 命令可帮助你管理多个提交,包括

  • 展平(或 Git 术语中的压缩)多个提交,使它们看起来像是一次完成的
  • 删除其中一个提交
  • 将一个提交拆分为两个
  • 重新排序提交

是的,git rebase 命令可以通过重新排列、修改甚至删除提交来重写你仓库的提交历史。那么,让我们开始吧!

变基消息中的有用说明

git rebase -i 界面,正如其长格式 --interactive 标志所暗示的那样,是一个交互式界面。它提供了一个提交列表,然后你选择希望 Git 对每个提交执行的操作。不采取任何操作是一个有效的选择,但至少必须将一个提交标记为要压缩的提交,否则变基在功能上毫无意义。

  • p, pick — 选择此提交以保留。
  • e, edit — 编辑此提交以修改提交消息。
  • r, reword — 使用此提交,但也对其进行编辑。
  • s, squash — 将此提交压缩到之前的提交中。执行 git rebase -i 时,你必须至少有一个提交标记为 squash。
  • d, drop — 删除此提交。

压缩提交

假设你有两个提交,并且想要将它们压缩为一个。这可以通过使用 git rebase -i HEAD~2(这是相对于你当前位置的两个提交)命令,并在提交前放置单词 squash 来实现。

$ git rebase --interactive HEAD~2

运行此命令会在你的文本编辑器中打开一个提交列表,如下所示

pick 718710d Commit1.
pick d66e267 Commit2.

如果你想从两个提交创建一个提交,那么你必须修改脚本使其如下所示

pick 718710d Commit1.
squash d66e267 Commit2.

最后,保存并退出编辑器。之后,Git 应用所有更改并打开一个编辑器来合并这两个提交

# This is a combination of 2 commits.
# This is the 1st commit message:

Fuse smoke test versioning.

# This is the commit message #2:

Updated the code.

# Please enter the commit message for your changes.

保存此操作会生成一个包含先前两个提交更改的单个提交。

重新排序提交

假设你有三个提交,并且想要更改它们的顺序,使 Commit3 排在第一位,Commit2 排在第二位,然后 Commit1 排在第三位。运行 git rebase -i HEAD~3 来实现此目的

$ git rebase --interactive HEAD~3

此脚本在你的编辑器中打开

pick 8cfd1c4 Commit1
pick 718710d Commit2
pick d77e267 Commit3

像这样修改脚本

pick d77e267 Commit3
pick 718710d Commit2
pick 8cfd1c4 Commit1

当你保存并退出编辑器时,Git 会将你的分支回溯到这些提交的父级,并应用 d77e267,然后是 718710d,然后是 8cfd1c4,因为提交编号不匹配。

删除提交

假设你有两个提交,并且想要删除第二个提交。你可以使用 git rebase -i 脚本删除它。

$ git rebase -i HEAD~2

此脚本在你的编辑器中打开

pick 8cfd1c4 Commit1
pick 718710d Commit2

在你要删除的提交之前放置单词 drop,或者你可以直接从变基脚本中删除该行。

pick 8cfd1c4 Commit1
drop 718710d Commit2

然后保存并退出编辑器。Git 应用更改并删除该提交。

如果稍后序列中的许多提交依赖于你刚刚删除的提交,则这可能会导致合并冲突,因此请谨慎使用它。但是你可以选择还原更改。

谨慎使用变基

如果你在变基过程中进行到一半,并认为这不是一个好主意,请使用 git rebase --abort 命令还原你所做的所有更改。如果你已完成变基,但认为它是错误的或不是你想要的,则可以使用 git reflog 恢复分支的早期版本。

变基功能强大,可以用来保持你的仓库井井有条和历史记录清晰。一些开发人员喜欢变基主分支,以便提交讲述清晰的开发故事,而另一些开发人员则希望所有提交都完全按照从其他分支提议合并的方式保留。只要你仔细考虑你的仓库需要什么以及变基可能对其产生什么影响,git rebase 命令和 git rebase -i 界面都是有用的命令。

接下来阅读
标签
Avatar
我来自印度班加罗尔,目前在印度班加罗尔的红帽团队担任助理软件工程师。

2 条评论

“一些开发人员喜欢变基主分支” - 我认为你的意思是“变基他们的开发/功能/错误修复分支”或“从主分支变基” - 你几乎永远不应该在你的主分支或其他正在被其他开发人员积极使用的分支上进行变基,因为它可能会由于与提交历史的连接丢失而造成高度破坏。

在合并之前“清理”功能/错误修复分支的内容可能非常有用。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.