据我了解,像Mercurial这样的分布式修订控制系统的主要优点之一是,您不必担心会破坏超重要的主存储库(很多其他开发人员使用的存储库)中的某些东西,并且可以做所有的工作和研究在您的个人远程克隆中,直到您了解一切稳定并且可以将工作推回去。
因此,我想到了一个问题:是否有可能不推回所有更改历史记录(带有您自己进行的多个修订),而是仅推回实际上是您的 repo 和当前主状态之间的差异的一个历史记录。

一个例子:

hg init master-repo; cd master-repo
echo -e 'Important file\nWith Bug!' > file
hg commit -A -m "initial commit"
cd ..; hg clone master-repo hotfix-repo; cd hotfix-repo
echo "fix1" >> file
hg commit -m "first attempt to fix bug"
echo "fix2" >> file
hg commit -m 'Fixed it!'

现在(可能在拉取并与最新的主存储库的更改合并后),我只想回退一个更改集,其中包含我所做的所有更改,而没有本地提交历史记录。
一种可能的解决方案是再创建一个克隆,然后在两个克隆之间使用diff/patch提取/应用第一个克隆中的更改,然后在第二个 repo 中一次提交所有更改。然后像往常一样推。但是有可能仅使用 Mercurial 命令吗?

谢谢前进!

最佳答案

对于在尝试之前将试错变更集折叠为单个变更集是否好,意见不一:

  • 优点:避免在测试套件失败的历史记录中包含变更集-这些变更集不利于hg bisect并增加噪音。
  • 否:您不能折叠已发布到其他存储库的变更集-这样做只会重写本地更改集,然后您必须手动清理其他存储库。
    从技术上讲,在推送之前将一组变更集折叠为一个变更集是绝对安全的。你开始
    ... a --- b --- c --- x --- y --- z
    

    然后将其重写为
    ... a --- b --- c --- w
    

    其中w具有与z完全相同的存储库状态(但显然是不同的父更改集)。这里没有合并(因此没有合并冲突),因此它不会失败。

    重写后,可以拉入并与上游合并(de):
    ... a --- b --- c --- w --- v
                     \         /
                      d ----- e
    

    您需要扩展才能执行任何类型的历史记录重写。在这里,我建议以下之一:
  • Collapse extension:顾名思义,此扩展名专门用于折叠变更集。
  • Histedit extension:全面的历史记录编辑,但是fold命令可让您折叠变更集。
  • Rebase extension:此标准扩展名可以移动变更集并同时折叠它们。在上面的示例中,它将x --- y --- z移到e之后:
    ... a --- b --- c --- d --- e --- x' --- y' --- z'
    

    然后,您可以选择将x'折叠为z':
    ... a --- b --- c --- d --- e --- w'
    

    与仅将x折叠为z相比,重新基准化确实涉及合并,因此合并可能会失败。
  • 关于version-control - 如何插入一系列变化作为单一的变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9550496/

    10-13 07:48