我理解 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 命令可以通过重新排列、修改甚至删除提交来重写您的存储库的提交历史。那么让我们开始吧!

rebase 消息中的有用说明

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

  • 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 放在您要删除的提交之前,或者您可以直接从 rebase 脚本中删除该行。

pick 8cfd1c4 Commit1
drop 718710d Commit2

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

如果您在序列后面有许多提交依赖于您刚刚删除的提交,这可能会导致合并冲突,因此请谨慎使用。但是您可以选择恢复更改。

谨慎使用 rebase

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

Rebase 功能强大,可以帮助您保持存储库的组织性和历史记录的整洁。一些开发人员喜欢 rebase 主分支,以便提交讲述清晰的开发故事,而另一些开发人员则希望所有提交都按照从其他分支提议合并时的样子完全保留。只要您仔细考虑您的存储库需要什么以及 rebase 可能会如何影响它,git rebase 命令和 git rebase -i 界面都是有用的命令。

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

2 条评论

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

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

你好 Nathan,非常感谢您添加此评论,它非常具有信息量。是的,我指的是“rebase 他们的开发/功能/错误修复分支,而不是主分支”,我完全同意您的观点。

回复 作者:Nathan Neulinger

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