停止cherry-picking,开始合并,第10部分:VSTS的Web工作流
原作者: Raymond Chen
原文链接: Stop cherry-picking, start merging, Part 10: Web-based workflow for Azure DevOps (formerly VSTS)
翻译日期: 2024年5月
如果你使用Visual Studio Team Services (VSTS) Azure DevOps作为你的代码仓库托管服务,那么本系列中描述的许多工作流都可以完全通过Web界面来执行。
查找合并基础
这是Azure DevOps中没有便捷按钮可点击的唯一一步。
选项1:利用特殊知识。
如果你对团队管理分支的方式有特殊了解,你可能可以利用你强大的大脑来确定合并基础。在Windows部门,我们有内部网站可以让你查看仓库中的各种信息,你可以用它来找到合适的合并基础。例如,构建号由master分支确定,所以一个安全的(尽管可能不是最优的)合并基础是master分支上的提交,其构建号是你正在处理的两个分支的构建号的最小值。
选项2:让Azure DevOps查找。
第一次做这个操作非常烦人,之后的操作稍微好一些。
一次性设置:获取仓库克隆URL并在后面附加/vsts/info。访问该网站,你将获得一些JSON返回。在JSON的repository部分找到url属性。
{
"serverUrl": "https://dev.azure.com/fabrikam-fiber-inc",
"collection": {
...
},
"repository": {
"id": "2f3d611a-f012-4b39-b157-8db63f380226",
"name": "FabrikamCloud",
"url": "**https://dev.azure.com/fabrikam-fiber-inc/_apis/**
**git/repositories/2f3d611a-f012-4b39-b157-8db63f380226**",
...
"project": {
...
},
...
}
}
这个URL不会改变,所以你只需要查找一次。(我插入了换行符以提高可读性。实际上它是一行。)
接下来,如果你想获取合并基础的一个或多个对象是分支,你需要将其转换为提交ID。在Azure DevOps上访问你的仓库,在"分支"标签页中找到该分支,转到"提交"列并将鼠标悬停在提交ID上。会出现一个小文档图标:点击它可以将哈希值复制到剪贴板。
最后,要求Azure DevOps计算两个提交之间的合并基础。
https://dev.azure.com/fabrikam-fiber-inc/_apis/git/
repositories/2f3d611a-f012-4b39-b157-8db63f380226/
commits/**fe17a84cc2dfe0ea3a2202ab4dbac0706058e41f**/mergebases?
otherCommitId=**0360c963d7d86d040e9c33bba836feab14da4ad3**&
api-version=4.1-preview
URL的第一部分是我们在一次性设置期间获得的服务URL。替换两个提交ID(用粗体标记)。合并基础操作是对称的,所以列出它们的顺序无关紧要。(请注意,这是一个预览版API,所以最终我需要将URL更新为发布版本。)
结果将是更多的JSON:
{
"count": 1,
"value": [{
"commitId": "**be67f8871a4d2c75f13a51c1d3c30ac0d74d4ef4**"
}]
}
这就是你的合并基础。
这确实很麻烦。也许我可以说服我们的工程团队创建一个小小的网页,让人们可以输入两个提交或分支名称,它可以完成找到合并基础的繁重工作。
创建补丁分支
在Azure DevOps上访问你的仓库,并在"提交"页面中输入合并基础的提交ID。现在你正在查看该提交。转到"..."菜单(在"在分支中搜索"旁边)并点击"新建分支"。创建你的分支。
准备补丁分支
将更改应用到补丁分支。例如,如果你需要编辑文件,你可以转到文件并点击"编辑"。如果你需要cherry-pick,你可以转到你想要cherry-pick的提交并从"..."菜单中选择"Cherry-pick"。请注意,Azure DevOps不会直接cherry-pick到分支中;它会创建一个临时分支和一个从临时分支到目标分支的拉取请求。你可以将临时分支作为你的新补丁分支,以避免额外的提交。
现在你已经准备好将补丁分支合并到两个目标中,你可以创建拉取请求。
查看拉取请求的预期结果
工作流的某些部分包括"验证合并不会导致代码更改"的步骤。要在Azure DevOps中执行此操作,可以转到"..."菜单并选择"查看合并提交"。这将显示拉取请求将引入目标分支的更改。(提交不会有最终的提交消息,但这没关系,因为我们只对文件感兴趣。)如果没有更改,那么Azure DevOps将显示一个空的差异。
构建拉取请求的预期结果
在提交之前,你可能想要构建拉取请求的预期结果以测试结果。获取提议的合并提交的哈希值,比如通过点击哈希旁边的"复制"图标从网页复制它。假设提交哈希是xyz。
获取提交并检出它。
git fetch origin xyz
git checkout xyz
如果你使用VFS for Git,则可以跳过获取步骤,因为VFS for Git会按需下载git对象。
请注意,你现在处于分离的HEAD状态。如果你进行任何提交(比如修复问题),你的提交不会进入任何命名分支。你必须将它们cherry-pick回补丁分支。
确保结果是一个合并
在拉取请求页面上,当你即将完成拉取请求时,确保取消选中"压缩"按钮。
幸运的是,Azure DevOps允许你在完成对话框中预加载复选框,所以点击"完成"按钮,取消选中"压缩"框,然后取消完成。这样,当你最终决定完成拉取请求时,你就不会忘记取消选中该框。
这就是本系列的全部内容。我希望你现在对递归合并算法和三向合并算法有足够的了解,可以将这些原则应用到你自己的场景中,在这些场景中,你可能会尝试在最终合并的分支之间cherry-pick更改。