如何在mercurial中推动一堆变化

eas*_*825 6 version-control mercurial dvcs

据我所知,像Mercurial这样的分布式修订控制系统的主要优点之一就是你不应该担心在你的超级重要主仓库中破坏某些东西(很多其他开发人员都会使用它),并且你所做的就是所有的工作和研究在你的个人远程克隆中,直到你明白一切都稳定,你可以推动你的工作.因此我得到了一个问题:如果有可能不会推回所有的更改历史记录(您为自己制作了几个修订版),但只有一个实际上是在您的回购和当前状态之间的差异.

一个例子:

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!'
Run Code Online (Sandbox Code Playgroud)

现在(可能在拉动并合并最新的master-repo'更改之后)我想只推回一个包含我在没有本地提交历史记录的情况下完成的所有更改的变更集.一种可能的解决方案是再创建一个克隆,然后在两个克隆之间使用diff/patch从第一个克隆中提取/应用更改,并在第二个repo中一次性提交所有更改.然后像正常情况一样按下.但是有可能只使用mercurial命令吗?

谢谢你!

Mar*_*ler 5

关于在推送之前将试错变更集合并为单个变更集是否合适的观点不同:

  • 优点:您避免在您的测试套件失败的历史记录中进行更改集 - 这些更改集不利于hg bisect并添加噪声.

  • Con:您无法折叠已发布到其他存储库的变更集 - 这样做只会重写您的本地变更集,然后您必须手动清理其他存储库.

从技术上讲,在推送之前将一组变更集折叠为单个变更集是完全安全的.你从一开始

... a --- b --- c --- x --- y --- z
Run Code Online (Sandbox Code Playgroud)

然后你把它改成了

... a --- b --- c --- w
Run Code Online (Sandbox Code Playgroud)

哪里w有完全相同的存储库状态z(但显然是一个不同的父变更集).这里没有合并(因此没有合并冲突),因此它不会失败.

重写后,您可以拉上并合并上游(de):

... a --- b --- c --- w --- v
                 \         /
                  d ----- e
Run Code Online (Sandbox Code Playgroud)

您需要扩展来进行任何类型的历史重写.在这里,我建议其中一个: