Git Rebase

17 Mar 2025 | 6 分钟阅读

Rebasing 是将提交重新应用到另一个基础trip上的过程。它用于将来自不同分支的一系列提交应用到最终提交中。它是 git merge 命令的替代方案。它是一个线性的合并过程。

在 Git 中,术语 rebase 指的是将一系列提交移动或组合到新的基础提交的过程。Rebasing 非常有益,它在功能分支工作流程的环境中可视化了该过程。

在合并您的分支之前,最好先对分支进行 rebasing。

Git Rebase

一般来说,它是 git merge 命令的替代方案。Merge 始终是一个前向更改的记录。相比之下,rebase 是 git 中一个引人注目的历史重写工具。它逐个合并不同的提交。

假设您在您的主分支上进行了三个提交,在名为 test 的其他分支上进行了三个提交。如果合并此分支,它将一次合并所有提交。但是,如果您对其进行 rebasing,它将以线性方式合并。请看下面的图片

Git Rebase

上图描述了 git rebase 的工作原理。主分支的三个提交与测试分支的提交线性合并。

合并是集成分支的最简单方法。它在两个最新的分支提交之间执行三方合并。

如何进行 Rebase

当您在功能分支(测试分支)和主分支上进行了一些提交时。您可以对其中任何一个分支进行 rebase。使用 git log 命令来跟踪更改(提交历史)。签出您要 rebase 的目标分支。现在执行 rebase 命令,如下所示

语法

如果分支中存在一些冲突,请解决它们,并执行以下命令以继续更改

它用于检查状态,

以上命令用于继续您所做的更改。如果您想跳过更改,您可以按如下方式跳过

当 rebasing 完成时。将存储库推送到 origin。请看下面的示例以了解 git merge 命令。

假设您有一个分支,例如 test2,您正在其中工作。您现在位于 test2 分支上,并在项目的 newfile1.txt 文件中进行了一些更改。

将此文件添加到存储库

现在,提交更改。使用以下命令

输出将如下所示

[test2 a835504] new commitfor test2 branch
 1 file changed, 1 insertion(+)

将分支切换到 master

输出

Switched to branch 'master.'
Your branch is up to date with 'origin/master.'

现在您位于主分支上。我已将更改添加到我的文件,例如 newfile.txt。以下命令用于将文件添加到存储库中。

现在提交文件以进行更改

输出

[master 7fe5e7a]  new commit made on master
 1 file changed, 1 insertion(+)
HiMaNshU@HiMaNshU-PC MINGW64 ~/Desktop/GitExample2 (master)

要检查日志历史记录,请执行以下命令。

输出

Git Rebase

正如我们在日志历史记录中看到的那样,主分支中有一个新的提交。如果我想对我的 test2 分支进行 rebase,我该怎么做?查看下面的 rebase 分支场景

Rebase 分支

如果我们有来自不同分支的许多提交,并希望将其合并到一个提交中。为此,我们有两个选择,我们可以合并它或对其进行 rebasing。最好对您的分支进行 rebasing。

从上面的示例中,我们已提交到主分支,并希望将其重新提交到 test2 分支上。让我们看看下面的命令

此命令将您从 master 切换到 test2 分支。

输出

Switched to branch 'test2.'

现在您位于 test2 分支上。因此,您可以使用主分支对 test2 分支进行 rebase。查看以下命令

此命令将对 test2 分支进行 rebase,并将显示为 Applying: new commit on test2 branch。请看下面的输出

输出

Git Rebase

Git 交互式 Rebase

Git 通过交互式 Rebase 提供了便利;它是一个强大的工具,允许对现有提交执行各种操作,如 编辑、重写、重新排序 等。交互式 Rebase 只能在当前签出的分支上操作。因此,将您的本地 HEAD 分支设置在侧边栏中。

可以使用 rebase 命令调用 Git 交互式 rebase,只需在 rebase 命令之后键入 -i 即可。这里的“i”代表交互式。此命令的语法如下

语法

它将列出所有可用的交互式选项。

输出

Git Rebase

在给定的输出之后,它将使用可用选项打开一个编辑器。请看下面的输出

输出

Git Rebase

当我们执行 git 交互式 rebase 命令时,它将使用上述输出打开您的默认文本编辑器。

它包含的选项如下

  • Pick(挑选)
  • 重述
  • 编辑
  • 压缩
  • 修复
  • 执行
  • 骨折
  • 拖放
  • 标签
  • 重置
  • 合并

上述选项使用 git-rebase 执行其特定任务。让我们简要了解一下这些选项。

Pick (-p)

Pick 在这里表示包含提交。提交的顺序取决于 rebase 期间 pick 命令的顺序。如果您不想添加提交,则必须删除整行。

重述 (-r)

重述与 pick 命令非常相似。重述选项暂停 rebase 过程,并提供了一个更改提交消息的机会。它不会影响提交所做的任何更改。

编辑 (-e)

编辑选项允许修改提交。修改意味着可以完全添加或更改提交。我们还可以在 rebase continue 命令之前进行其他提交。它允许我们将一个大提交拆分成较小的提交;此外,我们可以删除在提交中所做的错误更改。

压缩 (-s)

压缩选项允许您将两个或多个提交合并成一个提交。它还允许我们编写新的提交消息来描述更改。

修复 (-f)

它与压缩命令非常相似。它丢弃了要合并的提交的消息。旧的提交消息用于描述这两个更改。

执行 (-x)

执行选项允许您对提交运行任意 shell 命令。

中断 (-b)

中断选项会在某个位置停止重新设置基线。它将稍后使用'git rebase --continue' 命令继续重新设置基线。

删除 (-d)

删除选项用于删除提交。

标签 (-l)

标签选项用于使用名称标记当前头部位置。

重置 (-t)

重置选项用于将 head 重置为标签。

GitMerge vs. Rebase

对于 git 用户来说,何时使用 merge 命令以及何时使用 rebase 命令是一个最常见的难题。这两个命令是相似的,并且都用于合并由存储库的不同分支进行的提交。

不建议在共享分支中使用 Rebasing,因为 Rebasing 过程会创建不一致的存储库。对于个人来说,Rebasing 可能比合并更有用。如果您想查看完整的历史记录,则应使用合并。合并会跟踪提交的整个历史记录,而 rebase 会重写一个新的历史记录。

Git rebase 命令被称为 git merge 的替代方案。但是,它们有一些关键的区别

Git 合并Git Rebase
合并会在合并时创建一个最终提交。Git rebase 在进行 rebasing 时不会创建任何提交。
它将所有提交合并为一个提交。它创建提交的线性轨迹。
它创建一个图形历史记录,可能有点难以理解。它创建一个可以轻松理解的线性历史记录。
合并两个分支是安全的。Git“rebase”处理严重的操作。
合并可以在公共和私有分支上执行。在公共分支上使用 rebase 是错误的选择。
合并将功能分支的内容与主分支集成。因此,主分支已更改,而功能分支的历史记录保持一致。主分支的 Rebasing 可能会影响功能分支。
合并会保留历史记录。Rebasing 会重写历史记录。
Git merge 会同时显示所有冲突。Git rebase 会逐个显示冲突。

下一个主题Git Squash