通过提取、合并和拉取更新代码
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Visual Studio 2019 | Visual Studio 2022
当项目有多个参与者时,通过下载和集成其他人上传到项目远程存储库的工作来更新本地 Git 存储库。 以下 Git 命令更新本地存储库:
- Git fetch 下载其他人上传到远程存储库的任何新提交。 本地存储库缓存中的远程跟踪分支会更新 - 本地分支保持不变。
- Git merge 将来自一个或多个源分支的提交集成到目标分支中。
- Git rebase 将来自源分支的提交集成到目标分支中,但使用的策略与 Git merge 不同。
- Git pull 执行提取操作,然后执行合并或变基操作,以将提取的提交集成到当前本地分支中。
在将本地存储库与远程存储库同步时,Visual Studio 会使用一部分这些 Git 命令。
有关 Git 工作流的概述,请参阅 Azure Repos Git 教程。
本文提供了下列任务的过程:
- 通过提取下载更改
- 通过合并或变基更新分支
- 下载更改并通过拉取更新分支
通过提取下载更改
Git 提取下载本地存储库中不存在的远程分支提交和引用的文件对象,并更新本地存储库缓存中的远程跟踪分支。 远程跟踪分支是远程分支的本地缓存只读副本,而不是本地分支。 Git 提取不会更新本地分支。 例如,如果 origin
指定的远程存储库具有一个 bugfix3
分支,则 Git 提取将更新名为 origin/bugfix3
的远程跟踪分支而不是本地 bugfix3
分支。 可以使用远程跟踪分支:
- 将远程跟踪分支与本地分支进行比较,以查看提取的更改。
- 将远程跟踪分支合并到本地分支中。
- 从远程跟踪分支创建新的本地分支。
Visual Studio 2022 通过使用“Git”菜单、“Git 更改”和“解决方案资源管理器”中的上下文菜单提供 Git 版本控制体验。 Visual Studio 2019 版本 16.8 还提供了团队资源管理器 Git 用户界面。 有关详细信息,请参阅“Visual Studio 2019 - 团队资源管理器”选项卡。
在“Git 更改”窗口中,选择“提取”。 然后选择“传出/传入”以打开“Git 存储库”窗口。
还可以从“Git”菜单中选择“提取”。
在“Git 存储库”窗口中,提取的提交显示在“传入”部分中。 选择一个提取的提交以查看该提交中已更改文件的列表。 选择一个已更改文件以查看已更改内容的差异视图。
提示
“提取”不会删除本地存储库缓存中不再具有远程对应项的远程跟踪分支。 若要将 Visual Studio 配置为在提取期间删除过时的远程跟踪分支:
- 选择“工具”>“选项”>“源代码管理”>“Git 全局设置”。
- 将“在提取期间删除远程分支”选项设置为
True
。
进行 Git 提取后,可以将本地分支与其相应的远程跟踪分支进行比较,以查看远程分支上的更改。 如果决定使用提取的更改更新当前本地分支,可以执行 Git 合并或变基。 或者,可以运行 Git pull,该命令将 Git 提取与 Git 合并或变基相结合。 Git 合并和 Git 变基均通过对目标分支应用来自源分支的提交来更新目标分支。 但是,Git 合并和 Git 变基使用的策略不同。 有关详细信息,请参阅通过合并或变基更新分支和何时变基与合并。
通过合并或变基更新分支
Git 合并和 Git 变基将来自源分支的提交集成到当前本地分支(目标分支)中。 Git 合并执行快进或非快进合并。 非快进合并也称为三向合并或 true 合并。 Git 变基是另一种合并类型。 下图显示了这些合并类型。
Git 合并和 Git 变基广泛用于 Git 工作流中。 处理本地功能或 bug 修复分支时,常见做法是:
- 通过定期拉取以提取和合并远程提交,使本地
main
分支与其远程对应分支保持同步。 - 使用重基或合并,将本地
main
分支更新集成到本地功能分支。 - 通过将本地功能分支推送到相应的远程分支来备份你在本地功能分支上的工作。
- 功能完成后,创建拉取请求以将远程功能分支合并到远程
main
分支中。
此方法可帮助你:
- 随时了解其他人可能会影响你的工作的最近工作。
- 及时解决你的工作与其他人的工作之间的任何冲突。
- 在最新项目内容上应用新功能。
- 获取工作的拉取请求评审。
合并
对于 Git 合并,如果目标分支的尖端存在于源分支中,则默认合并类型将为快进合并。 否则,默认合并类型将为非快进合并。
快进 Git 合并永远不会有合并冲突,因为如果目标分支的尖端已经从源分支偏离,Git 就不会应用快进合并。 默认情况下,Git 尽可能使用快进合并。 例如,Git 将对本地分支(你仅通过从它的远程对应分支拉取来更新它)应用快进合并。
非快进 Git 合并会生成一个新的目标分支“合并提交”,将源分支更改与目标分支更改集成。 适用的更改是在最后一次提交(对两个分支通用)之后进行的更改。 在上图中,提交 C 是两个分支中的最后一个通用提交。 如果任何源分支更改与任何目标分支更改冲突,则 Git 将提示你解决合并冲突。 合并提交 (L) 包含集成的源分支和目标分支更改。 源分支尖端和目标分支尖端(K 和 E)是合并提交的父级。 在分支的提交历史记录中,合并提交是有用的合并操作标记,并清楚地显示合并的分支。
Git 合并仅修改目标分支,源分支保持不变。 遇到一个或多个合并冲突时,必须解决这些冲突才能完成合并。 或者,可以取消合并操作,并将目标分支返回到其以前的状态。
有关合并选项和策略的详细信息,请参阅 Git 参考手册和 Git 合并策略。
提示
如果源分支是远程跟踪分支,请在合并之前运行 Git fetch,确保该分支是最新的。
从菜单栏中选择“Git”>“管理分支”以打开“Git 存储库”窗口。
在“Git 存储库”窗口中,右键单击目标分支并选择“签出”。
右键单击源分支,并选择“将 <source-branch> 合并到 <target-branch>”。
成功合并后,Visual Studio 将显示一条确认消息。
如果由于合并冲突而停止了合并,Visual Studio 将通知你。 你可以解决冲突,也可以取消合并,返回到合并前状态。
变基
Git 变基对目标分支的提交历史记录进行重新排序,使其包含所有源分支提交,后跟自上次通用提交以来的所有目标分支提交。 另一种查看方法是,Git 变基在源分支历史记录的基础上重播目标分支中的更改。 如果任何源分支更改与任何目标分支更改冲突,则 Git 将提示你解决合并冲突。 Git 变基不会创建合并提交。 值得注意的是,Git 变基会更改现有目标分支提交的顺序,而其他合并策略的情况并非如此。 在上图中,提交 K' 包含与 K 相同的更改,但具有新的提交 ID,因为它链接回提交 E 而不是 C。
Git 变基仅修改目标分支,源分支保持不变。 遇到一个或多个合并冲突时,必须解决这些冲突才能完成变基。 或者,可以取消变基操作,并将目标分支返回到其以前的状态。
如果你是处理功能或 bug 修复分支的唯一人员,请考虑使用 Git 变基将新的 main
分支提交集成到其中。 否则,请使用 Git 合并。 有关 Git 变基以及何时使用它的详细信息,请参阅通过变基应用更改和变基与合并。
提示
如果源分支是远程跟踪分支,请在变基之前运行 Git fetch,确保该分支是最新的。
选择“Git”>“管理分支”以打开“Git 存储库”窗口。
在“Git 存储库”窗口中,右键单击目标分支并选择“签出”。
右键单击源分支,选择“将 <target-branch> 变基到 <source-branch> 上”。
成功变基后,Visual Studio 将显示一条确认消息。
如果由于合并冲突而停止了变基,Visual Studio 将通知你。 可以解决冲突,也可以取消变基并返回到变基前状态。
下载更改并通过拉取更新分支
默认情况下,Git 拉取将 Git 提取和 Git 合并相结合,以从其远程分支更新当前本地分支。 (可选)Git 拉取可以执行 Git 变基而不是 Git 合并。
与 Git 提取不同,Git 拉取将在从远程存储库下载新提交后立即更新当前本地分支。 如果知道要在进行 Git 提取后立即更新当前本地分支,请使用 Git 拉取。
提示
若要将 Visual Studio 配置为在拉取时进行变基而不是合并,请执行以下操作:
- 在“Git”菜单中转到“工具”>“选项”>“源代码管理”>“Git 全局设置”。
- 将“拉取时变基本地分支”选项设置为
True
。
在“Git 更改”窗口中,选择“拉取”。
还可以从“Git”菜单中选择“拉取”。
拉取操作完成后,将显示一条确认消息。
如果在拉取操作的合并部分发生冲突,Visual Studio 将通知你。 你可以解决冲突,也可以取消合并,返回到合并前状态。
注意
在 Visual Studio 中,“同步”依次执行拉取和推送操作,以同步本地和远程分支。 有关“同步”的详细信息,请参阅在 Visual Studio 中使用 git 提取、拉取、推送和同步进行版本控制。