通过变基应用更改
本文内容
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 变基会更改现有目标分支提交的顺序,而其他合并策略的情况并非如此。 在上图中,提交 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 - 团队资源管理器”选项卡。
选择“Git”>“管理分支”以打开“Git 存储库”窗口。
在“Git 存储库”窗口中,右键单击目标分支并选择“签出”。
右键单击源分支,选择“将 <target-branch> 变基到 <> 上”。
成功变基后,Visual Studio 将显示一条确认消息。
如果由于合并冲突而停止了变基,Visual Studio 将通知你。 可以解决冲突 ,也可以取消变基并返回到变基前状态。
Visual Studio 2019 版本 16.8 及更高版本提供 Git 版本控制体验,同时保留团队资源管理器 Git 用户界面。 要使用团队资源管理器,请从菜单栏中取消选中“工具”>“选项”>“预览功能”>“新 Git 用户体验”。 可以互换使用任一界面中的 Git 功能。
在“团队资源管理器”中,选择“主页”,然后选择“分支”。
在“分支”视图中,右键单击目标分支,然后选择“签出”。
右键单击源分支,选择“变基到”。
验证变基选项,然后单击“变基”。
成功变基后,Visual Studio 将显示一条确认消息。
如果在变基期间出现冲突,Visual Studio 将通知你。 可以解决冲突 ,也可以取消变基并返回到变基前状态。
若要将源分支提交集成到目标分支中,请运行 git rebase
命令:
git rebase <source branch name> <target branch name>
如果当前本地分支是目标分支,则可以将 rebase 命令简化为:
git rebase <source branch name>
如果在变基期间出现冲突,Git 将通知你。 可以解决冲突 ,然后运行 git rebase --continue
,也可以运行 git rebase --abort
以撤消变基并返回到变基前状态。
在变基后强制推送本地分支
如果对以前推送的本地分支进行变基,后续的默认 Git 推送将失败 。 可改为强制推送本地分支以覆盖其远程对应分支,使它们的提交历史记录匹配。
若要在 Visual Studio 中强制推送,必须先启用“强制推送”选项:
转到“工具”>“选项”>“源代码管理”>“Git 全局设置”。
选择“启用推送 --force-with-lease”选项。
Git 推送 --force-with-lease
标志比 --force
标志更安全,因为它不会覆盖一个远程分支,该分支包含未集成到强制推送的本地分支中的提交。
在“Git 更改”窗口中,选择推送按钮以推送提交。
或者,可以从“Git”菜单中选择“推送”。
如果默认的 Git 推送操作失败,Visual Studio 将启动“Git 推送失败”对话框。 选择“强制推送”。
成功推送后,Visual Studio 将显示一条确认消息。
Visual Studio 2019 版本 16.8 及更高版本提供 Git 版本控制体验,同时保留团队资源管理器 Git 用户界面。 要使用团队资源管理器,请从菜单栏中取消选中“工具”>“选项”>“预览功能”>“新 Git 用户体验”。 可以互换使用任一界面中的 Git 功能。
在“团队资源管理器”中,选择“主页”,然后选择“同步”以打开“同步”视图。
在“同步”视图中,选择“推送”将更改上传到远程存储库。
如果默认的 Git 推送操作失败,Visual Studio 将启动“Git 推送失败”对话框。 选择“强制推送”。
成功推送后,Visual Studio 将显示一条确认消息。
提示
Git 推送 --force-with-lease
标志比 --force
标志更安全,因为它不会覆盖一个远程分支,该分支包含未集成到强制推送的本地分支中的提交。
将本地分支中的新提交强制推送到同名远程分支:
git push --force-with-lease <remote> <local branch name>
如果要推送的分支是已签出分支,则可以将 force push 命令简化为:
git push --force-with-lease <remote>
当你克隆远程存储库时,Git 将别名 origin
指定为克隆的远程存储库的 URL 的简写形式。 运行 git remote -v
以检查 origin
别名值。 要手动添加 origin
别名,请运行 git remote add origin <remote repo url>
。 使用 origin
别名,你可以进一步精简 force push 命令:
git push --force-with-lease origin
如果当前的本地分支跟踪 origin
上的远程分支,则你可以完全缩写 force push 命令:
git push --force-with-lease
但是,如果本地分支不跟踪远程分支,则完全缩写的 push 命令将失败。 运行 git remote show origin
以检查分支的跟踪状态。
交互式变基以对本地提交进行 Squash 操作
通常,在本地功能分支中处理新功能时,你将创建多个提交。 准备好发布新功能时,可能需要将这些提交合并到单个提交中,简化提交历史记录。 可以使用交互式变基将多个提交 Squash 为单个提交。
Visual Studio 2022 不支持交互式变基。 请改用 Git 命令行。
Visual Studio 2019 不支持交互式变基。 请改用 Git 命令行。
查看要对其执行交互式变基的本地分支。
提交 、储藏或放弃任何未提交的更改。
估计要追溯到多远的提交历史记录。 不必非常精确,因为在运行交互式变基命令时,你将挑选出要进行 Squash 的特定提交。 例如,如果要对最后五个提交中的提交进行 Squash,请运行:
git rebase -i HEAD~5
Git 将打开一个编辑器,其中列出了最后五个提交,从最近的提交开始。 例如:
pick 7068b09 Update README network switch section
pick 9d247f7 Update README network controller section
pick 5d7ab9f Fix fiber optic transmitter test
pick 7b43f3f Add network switch test
pick 00859d9 Add network controller test
将第一行保留为原样。 在后续行中,若要将提交与上面的提交合并,请将 pick
更改为 squash
。 例如,若要合并前两个提交以及后两个提交,请将提交列表修改为:
pick 7068b09 Update README network switch section
squash 9d247f7 Update README network controller section
pick 5d7ab9f Fix fiber optic transmitter test
pick 7b43f3f Add network switch test
squash 00859d9 Add network controller test
保存并关闭编辑器。 然后,Git 将为每个合并的提交集打开一个新的编辑器,提示你输入提交消息。 对于每个提交集,将提交消息压缩为一条消息,然后保存并关闭编辑器。 在前面的示例中,经 Squash 操作的提交通过新的提交消息进行压缩:
8fcb88f Update README network sections
ac6d3c0 Fix fiber optic transmitter test
f0aadc3 Add two network tests
即使提交 Fix fiber optic transmitter test
未进行 Squash,它也有一个新的提交 ID,因为它现在链接到不同的前置提交。
有关交互式变基的详细信息,请参阅 Git 变基交互模式 。
注意
Azure DevOps 用户可进行 Squash 合并 ,以在拉取请求期间压缩主题分支的提交历史记录。
后续步骤
相关文章