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

TFS getting Branch -> Rollback -> Merge backwards and wanting to erase all changes

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

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

需要说明的是,Dev 是 Stage 和 Dev2 分支的父级。

根据您的描述,合并过程似乎没有在 Dev 分支中获取回滚 changeset1,这导致了这种情况。

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

tf rollback /keepmergehistory

This option has an effect only if one or more of the changesets that you are rolling back include a branch or merge change. Specify this option if you want future merges between the same source and the same target to exclude the changes that you are rolling back.

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

此外,你也可以看看这个类似的问题:

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

所以我做的是:

  1. 将更改从变更集 1 移动到搁置集中
  2. 将 Dev 合并到 Dev2,从而删除所需的更改
  3. 取消搁置变更集 1 搁置到 Dev2

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

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

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

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

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

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

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

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