TFS 获取分支 -> 回滚 -> 向后合并并希望删除所有更改

Posted

技术标签:

【中文标题】TFS 获取分支 -> 回滚 -> 向后合并并希望删除所有更改【英文标题】:TFS getting Branch -> Rollback -> Merge backwards and wanting to erase all changes 【发布时间】:2020-01-08 19:15:37 【问题描述】:

我们在项目的 Dev 分支中提交了一些更改(我们称之为 changeset1),这些更改确实应该在新分支中完成。所以我修复它的方法是从 Dev 分支创建一个新分支(我们称之为 Dev2)。然后我将 Dev 分支回滚到 changeset1 之前。所以现在代码库看起来像是在 Dev2 中完成的开发,而 Dev 从未被触及。

后来,我在 Dev 中做了一些开发,将其合并到 Stage,然后是 Prod。现在我也在尝试将这些更改合并到 Dev2 中,但是当我执行合并时(在 VS 2017 中)它会自动合并所有内容,并且它想要从 changeset1 中删除所有更改。我猜是因为我在 changeset1 之后回滚了 Dev,它认为这是最新的更改,并希望将该回滚合并到 Dev2。如何让它将 Dev2 视为最新的并将我的新 Dev 更改合并到其中而不删除 changeset1 的更改?

为了澄清,Dev 是 Stage 和 Dev2 分支的父级。

【问题讨论】:

【参考方案1】:

根据您的描述,似乎合并过程没有在开发分支中提取回滚变更集1,这导致了这种情况。

这是因为您在回滚期间没有使用/keepmergehistory 选项。

tf 回滚/keepmergehistory

只有当一个或多个变更集 您正在回滚包含分支或合并更改。 指定此项 如果您希望将来在同一来源和同一来源之间进行合并,则可以选择 目标以排除您正在回滚的更改。

请在此处阅读我们官方教程中的详细说明和一些示例:Example: /keepmergehistory Option

另外,你也可以看看这个类似的问题:TFS merge doesn't pick up rollback changeset(s)

【讨论】:

谢谢你,帕特里克。我在 VS 中使用源代码管理资源管理器来回滚,所以无论它使用什么。但是,我认为您引用的第一句话使我的情况不合格。 Dev 分支没有签入任何合并或分支更改。我将 from Dev 分支以创建 Dev2,但 Dev2 会有分支更改,对吧? 就粗体部分而言,“相同”一词的使用让我感到厌烦,但听起来它正在这样做,我不希望它这样做。我将更改分支到 Dev2,回滚 Dev,现在想将 Dev 合并到 Dev2 中,保留所有 Dev2 更改(没有冲突),但它想删除它们。【参考方案2】:

我想出了一个办法来解决它。所以重新迭代,我认为问题是我想要的更改是在 Dev2 中,但是我在创建 Dev2 后回滚了 Dev,所以回滚是最近的更改,所以合并想要保留回滚并删除我想要的更改远离 Dev2。所以我得出的结论是,我需要以某种方式将这些更改再次应用到 Dev2,就好像它们是一个新的编辑一样。

所以我做的是:

    将变更从 changeset1 移到 Shelveset 将 Dev 合并到 Dev2,从而删除所需的更改 将 changeset1 Shelveset 取消搁置到 Dev2

#1 是最难的部分。首先,我创建了两个新工作区:DevC0 和 DevC1。我将 changeset1 之前的变更集拉到 DevC0 中,并将 changeset1 拉到 DevC1 中。所以现在 DevC1 拥有我感兴趣的所有更改,而 DevC0 没有。然后,我将所有更改的文件(使用 BeyondCompare,但我认为您也可以将除 TFS 文件夹/文件之外的所有文件)从 DevC1 复制到 DevC0。然后在命令行中,我在 DevC0 文件夹上做了一个tf vc reconcile,让它能够识别我刚刚复制过来的所有更改。例如。 (在我的情况下,我实际上并不想要/deletes):

tf vc /reconcile /promote /adds /deletes /diff /recursive [DevC0 itemspec]

(确保命令提示符的工作目录是映射到目标工作区的目录)。之后,所有差异现在都显示为 Visual Studio 团队资源管理器/源代码管理资源管理器中的未决更改。所以我可以从那里创建一个 Shelveset。

#2 只是从 Dev 到 Dev2 的典型合并。它删除了所有更改并使 Dev2 与 Dev 匹配。我不知道在应用 Shelveset 之前是否需要签入,但我做了。

#3 我的 changeset1 更改在我的 Shelveset 中,但 Shelveset 属于 Dev 分支。幸运的是,Team Foundation Power Tools 可以将 Shelveset 取消搁置到不同的分支。例如:

tfpt unshelve /migrate /source:"[Dev server path]" /target:"[Dev2 server path]"

这会打开一个窗口,其中包含每个文件的合并选项。我手动查看了前几个,然后尝试自动合并所有。这相当于通过 Visual Studio 进行合并 - 它在可能的情况下自动合并,并在同一个窗口中将冲突留给我。在那之后,似乎所有需要的更改现在都在 Dev2 中等待更改,我将它们签入。

然后我尝试从 Dev2 合并回 Dev 只是为了看看它是否会正常运行,它确实将所有更改合并到 Dev 并将原始回滚删除的许多更改标记为未删除。目前,我撤消了该合并中的未决更改,直到我们真正准备好将此工作子分支合并到我们的主开发分支中。

【讨论】:

@PatrickLu-MSFT 好的。你还觉得/keepmergehistory 是这里的关键吗?我不清楚您是否说这可以帮助解决问题,或者只是我应该在创建分支时使用它,或者我的描述不清楚并且根本不适用。 是的,我仍然认为这是这里的关键。在回滚选项期间省略或包含/keepmergehistory 将在稍后进行合并时导致绝对不同的结果。如果您希望将来在同一源和同一目标之间进行合并以排除您正在回滚的更改,请指定 this/keepmergehistory 选项。下次建议你使用 tf rollback 命令来控制这个选项,而不是通过 vs UI。此外,在最新的 Visual Studio 版本中,无法使用 tfpt 命令,这意味着您也无法再使用tfpt unshelve /migrate

以上是关于TFS 获取分支 -> 回滚 -> 向后合并并希望删除所有更改的主要内容,如果未能解决你的问题,请参考以下文章

tfs 分支

代码审查工作流程+ TFS中的功能分支

如何在 TFS 2010 中恢复(回滚)签入

如何撤消 TFS 2010 中的变更集回滚?

TFS Azure 2017 工作项更改事件处理程序 - 分支关系

在 TFS 2013 中启动回滚后,我可以恢复我最近的本地更改吗?