【问题标题】:TFS: Overwrite a branch with anotherTFS:用另一个覆盖一个分支
【发布时间】:2015-10-22 07:09:03
【问题描述】:

是否可以用另一个分支覆盖?

或者是删除分支 B 并从分支 A 建立新分支的唯一解决方案?

【问题讨论】:

  • 你为什么要这样做?
  • 我们有一个分支,其中签入了一些未完成的代码,这些代码不再相关。

标签: tfs


【解决方案1】:

除非您运行的是 TFS 2010,否则我建议您使用 Merge + Resolve 使两个分支重新同步。

# cancel out of conflict dialog
tf merge A B -r -force -version:T
tf resolve B -r -auto:acceptTheirs

除了仅在 B 中创建且从未合并回来的文件外,这应该使所有内容均等化。使用文件夹差异来查找和协调它们。

在 2005/2008 年删除 + 重新分支会在未来冒着噩梦般的调试命名空间冲突的风险。如果您有 2008 年,另一个选项是销毁 + 重新分支。显然,假设您可以从 B 的原始副本中丢失所有历史记录。

【讨论】:

  • “在 2005/2008 年删除 + 重新分支有可能在未来发生噩梦般的调试命名空间冲突。” - 阿门!
  • “除非您正在运行 TFS 2010”是什么意思?除了您在此处为 TFS 2010 描述的合并和解析组合之外,您还会使用其他东西吗?为什么?
  • 您传递给 resolve 命令的 auto 选项的值是否应该是 TakeTheirs 而不是 acceptTheirs?这是我在文档中找到的值。 msdn.microsoft.com/en-us/library/6yw3tcdy(v=vs.100).aspx
  • 也许我错了,但我不会将此标记为正确答案。 'force' 选项只是忽略历史记录并合并更改,即使其中一些之前已合并。这里的关键点是 TFS 合并不是基于文件内容而是基于历史。 “毫无根据”的合并实际上完全解决了问题。
【解决方案2】:

在 Visual Studio 2010 中,我只是使用 baseless 合并来实现:

Tf merge /baseless [源路径] [目标路径] /recursive

当解决冲突窗口弹出时,选择“获取源版本”选项。注意,只存在于target中的文件不会被baseless merge删除,但是你可以比较两个分支来识别差异并手动删除。

参考:http://msdn.microsoft.com/en-us/library/bb668976.aspx

【讨论】:

  • 我认为这应该是问题的正确答案。正如我在上面所写的,“强制”选项并非在所有情况下都有用,因为它仍然基于变更集历史记录而不是文件内容。
【解决方案3】:

我使用Richard Berg's answer 取得了成功,但感觉缺少一些细节。这就是我能够消除与尚未合并回源的冲突解决和变更集相关的差异并使目标与源相同的方法。请注意,这就是我将如何引用分支 - source 是不应该更改的分支,而 target 是应该与 source 相同的分支。

  1. 确保您在工作区中拥有最新版本的源分支和目标分支。还要确保您没有任何待处理的更改。
  2. 放弃从目标分支到源分支的所有候选合并。这是为了防止这些差异在以后无意中合并回源分支。

tf merge $/target $/source /recursive /discard

注意:确保您已将工作文件夹设置为工作空间内的路径,以便 tf 工具知道要使用哪个工作空间和 TFS 服务器。

  1. 检查应解决的分支之间是否存在差异 - 如果没有,则无需采取进一步措施。

    3.1。查看目标分支上的历史记录并找到从源到目标的最后一次完整合并(忽略任何樱桃采摘合并,因为这将导致大量误报) - 请注意变更集编号。一个更简单的替代方法是执行从源分支到目标分支的合并,以从源分支获取最新版本到目标分支。

    3.2。在源代码管理资源管理器中右键单击源分支,然后从上下文菜单中选择比较。如果您在步骤 2.1 中将源分支合并到目标分支,则只为源获取最新版本。否则从源版本中选择变更集 |键入组合框,然后输入步骤 2.1 中的变更集编号。

    3.3。使用目标路径字段旁边的浏览按钮上的下拉箭头选择服务器路径。然后在打开的对话框中选择目标分支。

3.4。单击“比较”对话框上的“确定”进行比较。

  1. 执行从源分支到目标分支的合并并传递强制选项。这将忽略合并历史记录并合并变更集,即使它们过去已合并。

tf merge $/source $/target /recursive /force /version:T

注意:T版规格为最新版本。

  1. 关闭合并冲突对话框。

  2. 通过选择源分支自动解决所有冲突。

tf resolve $/target /recursive -auto:TakeTheirs

  1. 签到。

  2. 确认不再有任何从目标到源的合并候选,并且两个分支之间没有差异(这次只是使用最新版本,因为我们对最新版本进行了强制合并在第 4 步中。)。

有关 tf mergeresolve 命令的更多详细信息,请参阅 MSDN。

【讨论】:

    【解决方案4】:

    删除分支 B 并从分支 A 新建一个。

    您是否有不想这样做的原因?

    【讨论】:

    • 我想保持原名,不知道删除重新分支会不会有问题。
    • 没有我能想到的问题(除了如果你想取消删除旧分支会很困难)
    • 这个答案被否决了——我猜——因为历史会丢失。但是,如果您的目标是使目标分支与源分支相同,那么这段历史究竟有多重要?在某些情况下,这仍然是一种选择。
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2011-11-07
    • 2013-12-30
    • 2017-02-16
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多