如何正确撤消 P4V (Perforce) 中的错误提交?
How to correctly undo a bad commit in P4V (Perforce)?
好的,所以我正在使用 Perforce P4V 来备份我的 Unity 项目工作。我的一位队友检查了元文件的一些更改,这破坏了一切。没问题吧?这就是使用 P4 的全部意义所在。我们可以恢复它。只是...还原不起作用?
我看到的行为是
文件 A 在更改列表 1 中已更改
文件 B 在更改列表 2 中更改,
文件 C 和 A 在变更列表 3
中被更改
假设变更列表 3 包含不良变更
我点击了历史记录中的更改列表 2,然后点击了获取修订版,并选中了强制操作框。
更改列表 2 是最后一个已知的良好状态,我期望发生的是将我的所有文件恢复到提交更改列表 2 时我所处的状态。
相反,文件 C 已还原,但文件 A 未还原。就像,因为文件 A 在更改列表 2 中没有更改,所以它没有费心去获取那个版本。
所以我处于所有统一图元文件都被破坏并且所有预制引用都被破坏的状态。
当这不起作用时,我尝试使用获取修订返回到最新状态。然后使用回退。这同样没有用,图元文件仍然残缺不全。然后我尝试选择最后一个已知的良好状态并将整个项目文件夹回滚到该状态。再次,没有工作。但话又说回来,我当时可能已经严重破坏了我的项目,以至于没有任何效果。
我发现似乎正确还原文件和恢复损坏链接的唯一方法是手动选择每个文件或文件夹并将其还原到上次正确提交,每个 file/folder因为它们是在不同的提交中添加和更改的。
我不明白的是为什么 force get revision 没有自己做。或者撤消错误提交的“正确”方法是什么。
我什至尝试删除整个资产文件夹,然后使用 get revision force 使用最后一次已知的正确提交从服务器中提取一个全新的副本。这似乎一次完美地工作,但是当我试图重复它以验证我的结果时,它又回到丢失所有元文件链接的状态。恢复良好状态的唯一可靠方法似乎是手动强制将每个文件和文件夹提交到最后一次已知的正确提交。
这次我不得不手动修复我的错误,但我真的很感激能帮助我知道如何在未来以正确的方式做到这一点。
使用p4 undo
命令。
p4 undo @BADCHANGELIST
p4 submit
仅此而已!
(在 P4V 中有一个类似的操作称为“退出”——我在使用它时遇到了困难,并且更喜欢使用命令行,因为它更容易,但是 YMMV。)
请注意,p4 undo
和 p4 revert
是完全不同的命令!许多人对此感到困惑,因为 git
调用其“撤消”命令 git revert
,但 p4 revert
与 git revert
不同(它更像是 git reset --hard
).您不能使用 p4 revert
撤消已经提交的内容;它仅用于将您的待处理工作从软件仓库恢复到最新提交的状态。
我看看能不能解释一下你的尝试出了什么问题:
Let's say Changelist 3 contains the bad change I clicked on changelist 2 in my history, then clicked get revision, and checked the Force Operation box. changelist 2 being the last known good state what I expected to happen was to have all of my files restored to the state I was in when changelist 2 was submitted.
Instead, file C was reverted, but File A was not. It's like, since file A didn't change in changelist 2 it didn't bother to get that version.
IIRC 当您单击更改列表并使用它在 P4V 中同步时,它默认执行 p4 sync @CHANGE,CHANGE
而不是 p4 sync @CHANGE
——正如您所观察到的,如果您正在尝试“回滚”到整个工作区的较早状态。您可以通过单击某处同步对话框中的复选框来解决此问题。我相信如果您在“文件夹历史记录”视图中单击更改列表,它使用的路径 (p4 sync path/...@CHANGE
) 应该会更好。
一旦您设法将工作区同步到旧状态,如果您想使该状态永久化,您需要打开 edit
的文件(P4V 中的“签出”),sync
安排解决(P4V 中的“获取最新”),resolve
(在 P4V 中也是“解决”,确保您接受 your
工作区版本(P4V 可能称之为“接受”目标”,我不确定),然后是 submit
。同样,我建议只使用 p4 undo
,这样你就可以跳过所有这些手动步骤。
好的,所以我正在使用 Perforce P4V 来备份我的 Unity 项目工作。我的一位队友检查了元文件的一些更改,这破坏了一切。没问题吧?这就是使用 P4 的全部意义所在。我们可以恢复它。只是...还原不起作用?
我看到的行为是 文件 A 在更改列表 1 中已更改 文件 B 在更改列表 2 中更改, 文件 C 和 A 在变更列表 3
中被更改假设变更列表 3 包含不良变更 我点击了历史记录中的更改列表 2,然后点击了获取修订版,并选中了强制操作框。 更改列表 2 是最后一个已知的良好状态,我期望发生的是将我的所有文件恢复到提交更改列表 2 时我所处的状态。
相反,文件 C 已还原,但文件 A 未还原。就像,因为文件 A 在更改列表 2 中没有更改,所以它没有费心去获取那个版本。
所以我处于所有统一图元文件都被破坏并且所有预制引用都被破坏的状态。
当这不起作用时,我尝试使用获取修订返回到最新状态。然后使用回退。这同样没有用,图元文件仍然残缺不全。然后我尝试选择最后一个已知的良好状态并将整个项目文件夹回滚到该状态。再次,没有工作。但话又说回来,我当时可能已经严重破坏了我的项目,以至于没有任何效果。
我发现似乎正确还原文件和恢复损坏链接的唯一方法是手动选择每个文件或文件夹并将其还原到上次正确提交,每个 file/folder因为它们是在不同的提交中添加和更改的。
我不明白的是为什么 force get revision 没有自己做。或者撤消错误提交的“正确”方法是什么。
我什至尝试删除整个资产文件夹,然后使用 get revision force 使用最后一次已知的正确提交从服务器中提取一个全新的副本。这似乎一次完美地工作,但是当我试图重复它以验证我的结果时,它又回到丢失所有元文件链接的状态。恢复良好状态的唯一可靠方法似乎是手动强制将每个文件和文件夹提交到最后一次已知的正确提交。
这次我不得不手动修复我的错误,但我真的很感激能帮助我知道如何在未来以正确的方式做到这一点。
使用p4 undo
命令。
p4 undo @BADCHANGELIST
p4 submit
仅此而已!
(在 P4V 中有一个类似的操作称为“退出”——我在使用它时遇到了困难,并且更喜欢使用命令行,因为它更容易,但是 YMMV。)
请注意,p4 undo
和 p4 revert
是完全不同的命令!许多人对此感到困惑,因为 git
调用其“撤消”命令 git revert
,但 p4 revert
与 git revert
不同(它更像是 git reset --hard
).您不能使用 p4 revert
撤消已经提交的内容;它仅用于将您的待处理工作从软件仓库恢复到最新提交的状态。
我看看能不能解释一下你的尝试出了什么问题:
Let's say Changelist 3 contains the bad change I clicked on changelist 2 in my history, then clicked get revision, and checked the Force Operation box. changelist 2 being the last known good state what I expected to happen was to have all of my files restored to the state I was in when changelist 2 was submitted.
Instead, file C was reverted, but File A was not. It's like, since file A didn't change in changelist 2 it didn't bother to get that version.
IIRC 当您单击更改列表并使用它在 P4V 中同步时,它默认执行 p4 sync @CHANGE,CHANGE
而不是 p4 sync @CHANGE
——正如您所观察到的,如果您正在尝试“回滚”到整个工作区的较早状态。您可以通过单击某处同步对话框中的复选框来解决此问题。我相信如果您在“文件夹历史记录”视图中单击更改列表,它使用的路径 (p4 sync path/...@CHANGE
) 应该会更好。
一旦您设法将工作区同步到旧状态,如果您想使该状态永久化,您需要打开 edit
的文件(P4V 中的“签出”),sync
安排解决(P4V 中的“获取最新”),resolve
(在 P4V 中也是“解决”,确保您接受 your
工作区版本(P4V 可能称之为“接受”目标”,我不确定),然后是 submit
。同样,我建议只使用 p4 undo
,这样你就可以跳过所有这些手动步骤。