“Rollback...”和“Back Out Submitted Changelist #####”在Perforce P4V中有什么区别?

202

我想回滚一个提交记录所做的更改。在特定变更列表的右键上下文菜单中,有以下两个选项:

  • Rollback…
  • Back Out已提交的更改列表

这两个选项有什么区别?在什么情况下应该使用其中之一?


3
在这种情况下,“撤销已提交的变更列表”是我情况下正确的选项(只想还原checkin中的更改)。感谢您提供出色的答案。 - Dave Andersen
6个回答

225

这两个操作都可以将一组文件恢复到之前的状态,实质上比使用 p4 obliterate 命令更快、更安全地撤消错误(且您不需要管理员权限即可使用它们)。

在“Rollback...”的情况下,可以是任意数量的文件,甚至是整个工程库。您可以告诉它要回滚到特定版本、变更列表或标签。文件将被恢复到创建该版本、变更列表或标签时的状态。

在“Back Out Submitted Changelist #####”的情况下,恢复操作仅限于在变更列表#####中提交的文件。这些文件将被恢复到您提交该变更列表之前的状态,前提是自那时以来这些文件没有进行任何更改。如果对任何这些文件进行了后续更改,Perforce 将提示您这些文件现在已过期。您需要同步到头版本,然后解决差异。这样,您就不会无意中覆盖您实际想要保留的任何更改。

这两个操作的实质是将旧版本作为新版本提交。当您执行“Rollback...”时,您正在将文件恢复到特定时间点的状态,无论自那时以来发生了什么。当您执行“Back out...”时,您正在尝试在保留自那时以来发生的更改的同时,撤消您在特定时间点所做的更改。


18
我认为“撤回已提交的变更清单#####”会尝试保留在给定变更清单后对相同文件所做的更改。 - Ian Ringrose
1
@Ian:观察得好。当我写这篇文章时,我考虑的是立即纠正错误。通常情况下,如果你意识到想要撤销某些操作已经过了很长时间,那么问题就会变得更加复杂。我对我的回答进行了完善。 - raven
@IanRingrose 我刚刚执行了一个“回退”操作,看起来它并没有尝试保留之后所做的更改。我不得不进行同步,然后解决才能重新获取提交回退之后所做的更改。 - gdw2
@gdw2,我认为如果你执行“回滚”操作,那么你将无法选择“解决”,以便获取在提交后进行的更改。 - Ian Ringrose
1
尽管文件已经恢复到它们原来的状态,但元数据并没有。试图从另一个分支回滚集成将不允许您再次执行该集成,因为元数据表明它已经被集成了。 - Will Brode

18

撤销一个提交的更改

你无法撤消已成功提交的更改列表,但可以通过两种方式撤销先前提交的更改:

回滚 将文件或一组文件恢复到指定的更改列表、日期或版本。 在此时间点之后进行的任何更改都不会被保留。 反向回退 删除在给定的更改列表、日期或版本中进行的特定更改,但允许用户保留在随后的版本中进行的更改。

详细信息请参阅 https://www.perforce.com/perforce/r13.1/manuals/p4v/Working_with_changelists.html


8

Backout是还原或撤消我们的更改。其实现方式是,P4会在我们的本地工作区上撤销一个变更清单(默认或新)中的更改。然后,我们需要像处理其他变更清单一样提交/提交此被撤销的变更清单。这里的第二部分很重要,因为它不会自动将变更清单撤销到服务器上,我们必须提交被撤销的变更清单(这在做过之后是有意义的,但最初我认为它会自动执行该操作)。

正如其他人所指出的,Rollback具有更强大的功能——可以将更改恢复到特定日期、变更清单或版本号。


4

回滚...会提示您选择一个文件夹进行回滚,即它将在特定文件夹上工作,您可以回滚到标签、变更列表或日期。而撤销则是在特定变更列表中的文件上操作。


4
我将这个解释给用户,将Perforce更改列表与堆栈(来自数据结构)进行比较。
撤销将从堆栈的任何位置删除一个项目。
回滚会从堆栈顶部删除n个项目。

2
简单来说,两者的区别在于复数形式:
- Backout 撤销一个变更列表(无论是最近的还是其他的)。也就是撤销单个变更。 - Rollback 回滚多个变更列表以返回到之前的变更列表。也就是撤销多个变更。
我曾经经常忘记它们各自的含义,结果不得不多次查阅资料。为了解决这个问题,可以将回滚想象成多次旋转,希望这个事实能帮助你(和我!)记住 rollback 是复数形式。相比之下,backout 对我来说似乎“不太复数”。想象一下从一个 单独的 停车位上退出。
因此,助记口诀如下:
- Rollback → 多次旋转 - Backout → 从 单独的 停车位上退出
希望对你有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接