多年来我一直使用 Perforce,但不幸的是,除了一些业余项目外,很少使用 Git,所以请原谅我的无知。
在 Perforce 中,我使用如下所述的环积分概念。
开发人员在分支机构工作功能1v,功能2和特征3. 它们融入开发分支。开发只有当所有机器都成功编译后,分支才会进入稳定版本。这意味着每个从稳定版本集成到功能1,功能2或者特征3始终有一个可以进行整合的工作基础。
+---+stable
| ^
| |
| |
| dev <---+---+
| | |
| | |
+--->feature1+ |
| |
+--->feature2+---+
| |
+--->feature3+---+
问题是,这个概念在 git 中有意义吗?使用 DAG 是否可行?或者您如何构建 Git 中的分支结构?
答案1
这应该是可能的,而且我相信这在某种程度上是常见的。你画的只是一个关于如何维护的环,但实际上并没有在提交 DAG 中引入任何循环,因为分支名称(尤其是“稳定”)是移动目标,而提交 DAG 使用精确的父 ID。
也就是说,“feature1”没有被记录为基于“stable”,而是基于具体提交那是当时“稳定”的顶峰。一旦您将“feature1”合并到“dev”,然后从那里合并到“稳定”,这才不是追溯更新所有功能分支的基础,它们保留与之前相同的 DAG。
同样,合并分支只会整合当时的提交,而不会进行追溯更新。因此,您可以在开发过程中安全地将“stable”合并到“feature1”,这不会影响将来将“future1”合并到“dev”/“stable”中。(我偶尔会在 linux.git 中看到这种情况,但我相信他们会尽量避免,因为做生成一个丑陋的 DAG。)
除了反向合并,你还可以选择手动重新定基功能分支集成来自“稳定”的新工作。虽然这(像任何重写一样)会在新的基础之上创建新的提交,而丢弃基础中已经存在的提交。(因此,重新定基新合并的分支将导致出现空分支。)
通过这种方式仍然不可能引入循环,因为每个提交的 ID 都依赖于其父级(例如,如果有 A←B,则完全不可能重写 A 以获取 B←A 而不会使 B 已有的现有指针无效;您得到的只是 A←B←A' 而不是循环)。