通过变基应用更改

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Visual Studio 2019 | Visual Studio 2022

Git 通过将每个新提交链接到其前置提交,自动维护分支上的开发历史记录。 将一个分支合并到另一个分支时,历史记录可能会变得不那么简单。 例如,非快进合并通过创建包含多个前置提交的合并提交来合并不同的开发线。 相反,Git 变基在不创建合并提交的情况下合并不同的开发线,这使提交历史记录更简单,但会丢失有关合并的信息。 选择的合并类型可能会受是要保留合并记录还是简化提交历史记录的影响。

本文讨论何时使用变基而不是非快进合并,并提供以下任务的过程:

  • 对本地分支进行变基
  • 在变基后强制推送本地分支
  • 交互式变基以对本地提交进行 Squash 操作

有关 Git 工作流的概述,请参阅 Azure Repos Git 教程

对本地分支进行变基

Git 变基将源分支中的提交集成到当前本地分支(目标分支)中。 源分支保持不变。 为了进行比较,下图显示了 Git 变基和其他合并类型。

显示使用 Git 变基时前后提交的关系图。

Git 变基对目标分支的提交历史记录进行重新排序,使其包含所有源分支提交,后跟自上次通用提交以来的所有目标分支提交。 另一种查看方法是,变基在源分支历史记录的基础上重播目标分支中的更改。 值得注意的是,Git 变基会更改现有目标分支提交的顺序,而其他合并策略的情况并非如此。 在上图中,提交 K' 包含与 K 相同的更改,但具有新的提交 ID,因为它链接回提交 E 而不是 C。

在变基期间,如果源分支更改与目标分支更改冲突,Git 将提示你解决合并冲突。 可以像在合并期间解决合并冲突一样,在变基期间解决合并冲突。

变基与非快进合并

非快进合并(也称为三向合并或 true 合并)相比,Git 变基可使提交历史记录更简单但不太精确。 如果要在提交历史记录中记录合并,请使用非快进合并。

如果你是处理功能或 bug 修复分支的唯一人员,请考虑使用变基定期将最近的 main 分支工作集成到其中。 该策略有助于确保你随时了解其他人最近的工作,并及时解决出现的任何合并冲突。 通过变基,在最新的 main 分支工作的基础上实现新功能,这有助于维护线性提交历史记录。

有关 Git 变基以及何时使用它的详细信息,请参阅变基与合并

变基和强制推送指南

如果对以前推送的本地分支进行变基,然后再次运行默认的 Git push 命令,则推送将失败。 默认的 Git push 命令应用快进合并,将本地分支集成到远程分支中。 该命令将在变基后失败,因为变基会更改本地目标分支中现有提交的顺序,因此它不再与其远程对应分支的历史记录匹配。 在此场景中,通过覆盖远程分支,强制推送将成功。

Git 变基和强制推送是功能强大的工具,但在决定是否使用它们时,请记住以下准则:

  • 除非你确定没有人正在使用共享分支,否则不要对已推送并与他人共享的本地分支进行变基。 变基后,本地分支将不再与其远程对应分支的历史记录匹配。
  • 请勿强制推送到其他人正在使用的远程分支,因为远程分支的本地版本将不再与更新的远程分支历史记录匹配。
  • 你的团队应就重基和强制推送的使用场景达成一致。

提示

对于协作评审过程,请使用拉取请求将新工作合并到远程存储库的默认分支。

如何变基

Visual Studio 2022 通过使用“Git”菜单、“Git 更改”和“解决方案资源管理器”中的上下文菜单提供 Git 版本控制体验。 Visual Studio 2019 版本 16.8 还提供了团队资源管理器 Git 用户界面。 有关详细信息,请参阅“Visual Studio 2019 - 团队资源管理器”选项卡。

  1. 选择“Git”>“管理分支”以打开“Git 存储库”窗口。

    Visual Studio 中的 Git 菜单中“管理分支”选项的屏幕截图。

  2. 在“Git 存储库”窗口中,右键单击目标分支并选择“签出”。

    Visual Studio 的“Git 存储库”窗口中分支上下文菜单中“签出”选项的屏幕截图。

  3. 右键单击源分支,选择“将 <target-branch> 变基到 <> 上”。

    Visual Studio 的“Git 存储库”窗口中分支上下文菜单中“变基”选项的屏幕截图。

  4. 成功变基后,Visual Studio 将显示一条确认消息。

    Visual Studio 的“Git 存储库”窗口中变基确认消息的屏幕截图。

    如果由于合并冲突而停止了变基,Visual Studio 将通知你。 可以解决冲突,也可以取消变基并返回到变基前状态。

    Visual Studio 的“Git 存储库”窗口中变基冲突消息的屏幕截图。

在变基后强制推送本地分支

如果对以前推送的本地分支进行变基,后续的默认 Git 推送将失败。 可改为强制推送本地分支以覆盖其远程对应分支,使它们的提交历史记录匹配。

警告

切勿强制推送其他人正在处理的分支。 有关详细信息,请参阅变基和强制推送准则

若要在 Visual Studio 中强制推送,必须先启用“强制推送”选项:

  1. 转到“工具”>“选项”>“源代码管理”>“Git 全局设置”。

  2. 选择“启用推送 --force-with-lease”选项。

Git 推送 --force-with-lease 标志比 --force 标志更安全,因为它不会覆盖一个远程分支,该分支包含未集成到强制推送的本地分支中的提交。

  1. 在“Git 更改”窗口中,选择推送按钮以推送提交。

    Visual Studio 的“Git 更改”窗口中向上箭头推送按钮的屏幕截图。

    或者,可以从“Git”菜单中选择“推送”。

    Visual Studio 中“Git”菜单中的“推送”选项的屏幕截图。

  2. 如果默认的 Git 推送操作失败,Visual Studio 将启动“Git 推送失败”对话框。 选择“强制推送”。

    Visual Studio 中“Git 推送失败”对话框的屏幕截图。

  3. 成功推送后,Visual Studio 将显示一条确认消息。

    Visual Studio 中推送确认消息的屏幕截图。

交互式变基以对本地提交进行 Squash 操作

通常,在本地功能分支中处理新功能时,你将创建多个提交。 准备好发布新功能时,可能需要将这些提交合并到单个提交中,简化提交历史记录。 可以使用交互式变基将多个提交 Squash 为单个提交。

Visual Studio 2022 不支持交互式变基。 请改用 Git 命令行。

注意

Azure DevOps 用户可进行 Squash 合并,以在拉取请求期间压缩主题分支的提交历史记录。

后续步骤