通过变基应用更改

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

Visual Studio 2019 |Visual Studio 2022

Git 通过将每个新提交链接到其前置任务,自动维护分支上的开发历史记录。 将一个分支 合并 到另一个分支时,历史记录可能变得不那么简单。 例如, 无快进合并 通过将合并提交与多个前置任务合并来合并开发线组合在一起。 相反,Git 存储库 会合并不同的开发行,而无需创建合并提交,这会导致更简单的提交历史记录,但会丢失有关合并的信息。 选择 的合并类型 可能会受到是要保留合并记录还是简化提交历史记录的影响。

本文讨论何时使用 rebase 而不是非快速转发合并,并提供以下任务的过程:

  • 重新设置本地分支的基
  • 强制在存储库后推送本地分支
  • 交互式 rebase 以将本地提交压在一起

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

先决条件

类别 要求
项目访问权限 项目的成员。
权限 - 查看专用项目中的代码:至少 是基本 访问权限。
- 克隆或参与专用项目中的代码: 参与者 安全组的成员或项目中的相应权限。
- 设置分支或存储库权限: 管理 分支或存储库的权限。
- 更改默认分支: 编辑存储库的策略 权限。
- 导入存储库: 项目管理员 安全组的成员或 Git 项目级 “创建存储库 ”权限设置为 “允许”。 有关详细信息,请参阅设置 Git 存储库权限
Services 已启用存储库
工具 可选。 使用 az repos 命令: Azure DevOps CLI

注释

在公共项目中,具有 利益干系人 访问权限的用户具有对 Azure Repos 的完全访问权限,包括查看、克隆和参与代码。

类别 要求
项目访问权限 项目的成员。
权限 - 查看代码:至少 基本 访问权限。
- 克隆或参与代码: 参与者 安全组的成员或项目中的相应权限。
Services 已启用存储库

重新设置本地分支的基

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

显示使用 Git 存储库时提交前后的示意图。

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

在存储库期间,如果源分支更改与目标分支更改冲突,Git 将提示 你解决合并冲突。 可以采用在合并期间解决合并冲突的相同方式在重新数据库期间解决合并冲突。

Rebase 与 no-fast-forward 合并

Git 重定结果提交历史记录比 无快进 合并更简单但不太确切的提交历史记录,否则称为 三向真正的 合并。 如果想要在提交历史记录中记录合并,请使用无快进合并。

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

有关 Git 存储库以及何时使用它的详细信息,请参阅 Rebase 与合并

重新定基和强制推送指南

如果重新建立以前 推送的本地分支,然后再次运行默认的 Git 推送命令,推送将失败。 默认的 Git 推送命令应用快速转发合并,将本地分支集成到远程分支中。 该命令将在重新数据库后失败,因为重新base 会更改本地目标分支中的现有提交序列,因此它不再与其远程对应项的历史记录匹配。 在此方案中, 强制推送 将通过覆盖远程分支来成功。

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. 右键单击源分支,然后选择“将目标分支<重新定基>到<源分支>”。

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

  4. 成功重新设置数据库后,Visual Studio 将显示确认消息。

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

    如果由于合并冲突而停止了存储库,Visual Studio 会通知你。 可以 解决冲突,也可以取消重新数据库并返回到预重新数据库状态。

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

强制在存储库后推送本地分支

如果重新建立以前推送的本地分支,后续的默认 Git 推送将 失败。 相反,可以强制推送本地分支以覆盖其远程分支,以便其提交历史记录匹配。

警告

从不强制推送其他人正在处理的分支。 有关详细信息,请参阅 Rebase 和强制推送指南

若要在 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-Push 失败 对话框。 选择 “强制推送”。

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

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

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

交互式 rebase 以将本地提交压在一起

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

Visual Studio 2022 不支持交互式重新分组。 请改用 Git 命令行。

注释

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

后续步骤