据我了解,像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
完全相同的存储库状态(但显然是不同的父更改集)。这里没有合并(因此没有合并冲突),因此它不会失败。重写后,可以拉入并与上游合并(
d
和e
):... a --- b --- c --- w --- v
\ /
d ----- e
您需要扩展才能执行任何类型的历史记录重写。在这里,我建议以下之一:
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/