一、什么是PR
在正常的工作流程中,PR 用于将一个分支的更改合并到另一个分支,而这些更改通常以提交的形式存在。每个提交都有一个唯一的提交 ID,用于标识和跟踪更改的历史。因此一般情况下PR包含源分支的多个commit提交记录(pr_commit_ids),也有可能不包含任何commit。
如果一个 PR 没有任何提交 ID,可能有以下几种情况:
- PR 是空的:这意味着在创建 PR 之前,没有进行任何代码更改或提交。可能是由于误操作或其他原因,未正确添加更改并提交到分支中。
- PR 的提交已被删除:在某些情况下,可能会发生提交被删除或重置的情况。如果在创建 PR 之前提交已被删除,那么该 PR 将不包含任何提交 ID。
- PR 是用于讨论或协作:有时,团队成员可能会创建一个 PR,以便进行讨论、提出问题或请求反馈,而不涉及实际的代码更改。这种情况下,PR 可能只包含标题、描述和评论等信息,而没有实际的提交。
无论是哪种情况,一个没有提交 ID 的 PR 通常不会触发自动化构建、测试或代码审查等流程,因为没有实际的代码更改需要进行处理。
二、PR合并的三种方式
一旦创建PR就就意味着你发起了分支1(head,源分支)------->分支2(base,目标分支)的合并请求,就会产生一个PR链接:(如:https://github.com/quwenqiang2019/xxxxxx/pull/6),此时这个PR的状态是open,合并这个PR通常有三种方式,合并完成之后PR的状态就是merged或closed。如果PR没有合并,继续向源分支进行提交,这些创建PR之后新的提交将自动包含在该 PR 中。
2.1 create a merge commit
这是最基本的merge,这种情况下,pr包含的commit_ids(源分支的所有提交记录)会同步到中央仓库目标分支里面,合并之后目标分支上还会产生一个merge commit id。这个merge commit id就是将pr包含的commit_id(源分支的所有提交记录)会同步到中央仓库目标分支这个操作的提交。
2.2 squash and merge
这种情况下,pr包含的commit_ids(源分支的所有提交记录)不同步中央仓库目标分支里面,这种方式,当前分支(源分支)的多个提交会被压缩,在目标分支上形成一个提交(merge commit id),这个merge commit id就代表压缩源分支多个提交这个操作。
2.3 rebase and merge
这种情况下,pr包含的commit_ids(源分支的所有提交记录)通过变基,在目标分支上形成多个新的commit id逐个应用到目标分支上。这些新的提交会按照原始提交的顺序添加到目标分支上,形成一个线性的提交历史。因此变基(rebase)操作不会产生合并提交(merge commit id)。
三、一个简单的例子(merge合并)
pulls/20:
PR包含的commit_id是指源分支所有单个提交的commit_id(这其实是本地git commit产生,然push进行同步),而不是合并提交的merge_commit_id。merge_commit_id是合并操作的结果。61a0c56是pulls/20合并操作产生的merge_commit_id,是合并完成之后目标分支的最新commitID。
pulls/21:
这个PR(源分支上)有三次提交记录,包含三个commitID。我们一起通过API看下这个PR的详细信息:
源分支:
-
label是标签名称
-
ref是源分支名称
-
sha是源分支上最新的commit_id,也就是最后(最新)一次提交的commit_id
目标分支:
-
label是标签名称
-
ref是源目标名称
-
sha不是pulls/21合并产生的,是目标分支上最新的commit_id(由于目标分支上没有新的提交,这里也就是上一次pulls/20合并产生的commitID)
作者简介:
读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。