我们正在开发一个带有双分支系统(默认/稳定)的项目,并使用远程存储库。同事已在错误的分支稳定上实现了新功能,并将更改推送到远程存储库。应该对默认分支进行更改。
理想情况下,我希望最终将更改移动到默认分支,而不会在稳定分支上显示提交。我们有点搞砸了,因为它已被推了?
我克隆了回购并尝试回滚本地副本,但这没有我认为的效果。我试图使用rebase扩展,但我没有看到将提交移动到另一个分支的方法。我尝试了退出选项,但这留下了我不想要的历史。
我想我可以通过以下方式手动执行此操作:
这是唯一的方法吗?
答案 0 :(得分:1)
我首先graft
(请参阅hg help graft
)或rebase --keep
(请参阅hg help rebase
,您可能需要启用rebase扩展名)将更改从稳定更改为默认,然后退出(参见hg help backout
)来自稳定分支的变化。完成所有重新定位和退出后,请推送到您的团队使用的远程存储库。
答案 1 :(得分:1)
由于已经推送了错误更改,并且无法修改远程仓库上的历史记录,因此您必须添加一个完全逆转错误更改(backout
)影响的更改集。历史记录仍将包含错误提交及其在stable
中的反向,因此任何检查其对stable
的回购的人都将显示他们需要提取更新。除非您删除错误的变更集,否则无法避免这种情况。
只要错误提交中没有秘密(我不会想象会有任何秘密,如果它属于default
),那么这可能不是什么大问题。
编辑:正如Mark Tolonen指出的那样,如果已经推送了更改,则以下内容将无效(对于"发布" repo)。因此对OP没用。
如果您使用commit --amend
提交退出变更集,您可以非常接近不留痕迹;它会将退出结合到错误的变更集中,留下修改后的变更集,不会更改文件:
hg update -r oops
hg backout oops
<exit the editor without creating a commit message; commit is aborted>
hg commit --amend -m "Nothing to see here, folks"
历史记录中将不再显示错误的变更集:
% hg log -l 1
changeset: 4:969068ca0049
tag: tip
summary: Nothing to see here, folks
% hg diff -r tip
%
如果我没记错的话,原来的变更集对于拥有mercurial客户端的用户仍然可见,因为它不支持修改后的提交。
上述内容并不涉及将变更集移至正确的位置,但我相信您知道如何做到这一点(例如,graft
)。
答案 2 :(得分:1)
如果更改是公开的,则删除所有跟踪的唯一方法是删除公共存储库和所有克隆的更改。这可能是不切实际的。
要撤消更改,您需要将变更集移植回默认值,并从稳定版中退出变更集:
示例,当前状态:
命令:
hg update default
hg graft 3
hg update stable
hg backout 3
结果: