同事提交更改错误的分支并推送到远程存储库。如何解决这个问题?

时间:2017-03-21 16:57:16

标签: mercurial bitbucket tortoisehg

我们正在开发一个带有双分支系统(默认/稳定)的项目,并使用远程存储库。同事已在错误的分支稳定上实现了新功能,并将更改推送到远程存储库。应该对默认分支进行更改。

理想情况下,我希望最终将更改移动到默认分支,而不会在稳定分支上显示提交。我们有点搞砸了,因为它已被推了?

我克隆了回购并尝试回滚本地副本,但这没有我认为的效果。我试图使用rebase扩展,但我没有看到将提交移动到另一个分支的方法。我尝试了退出选项,但这留下了我不想要的历史。

我想我可以通过以下方式手动执行此操作:

  1. 制作已更改文件的副本
  2. 从本地和远程副本中删除变更集
  3. 更新为默认分支
  4. 将更改的文件带回项目
  5. 在本地提交更改
  6. 将更改推回远程仓库
  7. 这是唯一的方法吗?

3 个答案:

答案 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)

如果更改是公开的,则删除所有跟踪的唯一方法是删除公共存储库和所有克隆的更改。这可能是不切实际的。

要撤消更改,您需要将变更集移植回默认值,并从稳定版中退出变更集:

示例,当前状态:

Current state of repository

命令:

hg update default
hg graft 3
hg update stable
hg backout 3

结果:

Repository after commands