TFS/TFVC 合并选定的变更集 vs git 在分支之间挑选

TFS/TFVC merge selected changeset vs git cherry-pick between branches

我们会将 TFS/TFVC 存储库迁移到 Git。 在 TFVC 中,我们曾经有一个基于主干的开发,具有持久的发布维护分支。 发布分支上的错误修复必须合并回主干。 有时较小的功能必须从主干转移到发布分支。 在 TFVC 中,我们通过将单个(或小组)变更集从一个分支“合并”到另一个分支来做到这一点。 生成的变更集被标记为“合并”,尽管我不完全知道这对 TFVC 意味着什么,尤其是考虑到未来的合并操作。

所以我想象分支图看起来像这样: (尽管请注意 TFVC 从不显示任何图表)

-A--B--C---D--E--F---    trunk
  \       /    \
   G--H--I--J---K--L-    release-x

(这里的release分支是从A创建的,I->D是bugfix merge,E->K是feature-forward) 但也许我错了。在这种情况下,有人可以解释 TFVC 合并变更集的真正作用吗?

有人告诉我,在 Git 中的等效方法是挑选个人提交。 但是,在生成的分支图中,我没有看到在 cherry-pick 提交之后的分支之间有任何 link 。 我知道 cherry-picking 在技术上不是合并操作,因此分支之间的历史关系不会被延续。 有什么我想念的吗?有没有更好的方法将如此小的提交从一个分支转移到另一个分支,但仍保留一些合并信息? 我不想合并整个分支。例如变更集 B、C 或 H 必须与其他分支保持隔离。

当 Cherry picking 时,您可以添加 -x 选项让 git 在每个 cherry-picked 提交的提交消息中添加一条消息:

-x When recording the commit, append a line that says "(cherry picked from commit …​)" to the original commit message in order to indicate which commit this change was cherry-picked from. This is done only for cherry picks without conflicts. Do not use this option if you are cherry-picking from your private branch because the information is useless to the recipient. If on the other hand you are cherry-picking between two publicly visible branches (e.g. backporting a fix to a maintenance branch for an older release from a development branch), adding this information can be useful.

这是最接近的。精心挑选的提交记录为目标分支上的新提交,而不是反向或正向集成。

Git 不进行“部分合并”,因为 git 将工作树的状态存储为“版本”。 TFVC 存储单个文件的工作区版本。

您看到的是两个截然不同的东西。

在 TFVC 中,您会看到一个分支图,它通过具有已定义父分支的分支对象明确定义。这些分支之间的每个集成都是可视化的,因为合并存储哪些文件被合并,哪些变更集是该合并的一部分以及这些合并是基于哪个分支关系。 TFVC 中的变更集(最接近 git 中的提交)也是一个非常不同的东西。首先,一个变更集可以跨越多个分支,甚至是存储库,一个变更集包含 1 个或多个文件更改。

在Git中,分支只是指向提交图中某处提交的特殊指针。亲子关系是计算出来的(基于提交图),分支可以自由合并,而无需遵守预先配置的层次结构。可视化显示提交之间的关系,而不是分支。一种特殊类型的提交,即合并,会存储基于 2 个或更多其他提交创建新提交的时间。存储与这些提交的关系,而不是恰好指向这些提交的分支的名称。提交存储对工作树的更改。一个或多个分支可能指向该提交。

由于 cherry-pick 将提交树中一个分支上的更改重播到另一个分支上,因此它不会被记录为多组提交链接在一起的合并。相反,它被记录为恰好具有相同差异的新提交(如果您需要解决冲突,甚至可能没有差异)。

通过添加 -x 标志,关系存储在评论中。