Perforce:如何将以后的提交应用到同步到早期版本的工作区?

Perforce: how to apply a later commit to a workspace synced to an earlier version?

我有一个同步到更改列表 A 的工作区。

我需要使用更改列表 D 测试版本 A,该版本是在 A 之后提交到​​同一分支的几次提交。可以这么说,挑选它。

除了 p4 diff -du 和应用补丁之外,我该怎么做?

如果您满足于只获取 D 中的文件(在他们的@D 版本中),同时将其他所有内容同步到 A,这很简单:

p4 sync @D,@D

但如果 D 中的某些文件也受到更改 B 和 C 的影响,这可能是不可接受的,因为 D 修订版也将包含这些更改。对于真正的挑选,您必须打开文件,以便在挑选 D 之前执行一组忽略 B 和 C 的解析。我的方法是:

p4 -F "%depotFile%" files @D,@D | p4 -x - edit
p4 -F "%depotFile%@<D" files @D,@D | p4 -x - sync
p4 resolve -ay
p4 sync @D,@D
p4 resolve -am

如果存在合并冲突,您需要通过交互式 p4 resolve.

跟进

请注意,如果您实际提交了这些文件,您将回滚 B 和 C(至少在那些特定文件中)。

如果 B 和 C 不影响 D 中的文件(即 p4 files @D,@D 返回的文件),那么第 2 步和第 3 步将是空操作——同步到 @<D将只保留文件当前同步的修订版 (@A),resolve/ignore 不会有任何内容。然后第 5 步的解析将执行自动 "accept theirs"(即 "copy from" D),因为 A 和 D 之间没有 "ignored" 基础修订。

另一种可能的选择是在新分支中执行此操作(您不一定需要在任何时候提交):

p4 integ original_branch/...@A cherry_pick/...
p4 integ original_branch/...@D,@D cherry_pick/...
p4 resolve -am

这样做的主要缺点是,当您为分支打开所有文件时,它需要同步所有文件的新副本,但如果文件 large/numerous 不足以引起关注, p4 integ 的人体工程学更适合这类事情,在工作区的单独分支中做这样的事情会很方便,这样你就可以随意乱搞,而不会干扰任何其他正在进行的工作,然后在完成后用 revert 丢弃整个内容。