是的,你可以使用Mercurial。这是如何工作的。
假设您的当前克隆名称为new-dot-net
,因为它支持新的.Net版本,因为它支持 。你做一个克隆,并称之为 old-dot-net
或类似的东西。这两个克隆现在是相同的 和两个目标.Net 3.5。
现在仔细对old-dot-net
进行小的更改,以使其与 .Net 2.0兼容。当您更改的两个克隆将 开始出现分歧:
new-dot-net: ... [a] --- [b]
old-dot-net: ... [a] --- [b] --- [c] --- [d]
在这里你做出[c]
和[d]
的变更,添加NET 2.0 兼容性。请注意0克隆如何包含更多 变更集,因为它具有向后兼容性 变更,即不需要想要在new-dot-net
中查看。当您继续工作 时,请务必考虑这一点:net-dot-net
将包含 old-dot-net
中变更集的子集。变化从 new-dot-net
到old-dot-net
,但从来没有在相反的方向。
假设您在new-dot-net
中进行了新更改。你做出改变 在new-dot-net
现在的情况是这样的:
new-dot-net: ... [a] --- [b] --- [x]
old-dot-net: ... [a] --- [b] --- [c] --- [d]
你现在想回港的变化old-dot-net
还有,你 变化old-dot-net
和net-dot-net
拉:
% cd old-dot-net
% hg pull ../new-dot-net
这将创建一个new head在old-dot-net
:
[x]
/
old-dot-net: ... [a] --- [b] --- [c] --- [d]
因为[x]
变更集有[b]
,因为它是父变更集。你现在 有multiple heads,并且必须合并以减少头数 。通过合并您创建一个新的变更集,这是您的方式 说“这是如何组合[x]
和[d]
”。如果[x]
更改集只触及[c]
和 [d]
中未触及的代码,则合并应该正常工作。否则,您将通过合并工具呈现 ,并且必须解决冲突。您提交 合并为chageset [e]
:
[x] --------------.
/ \
old-dot-net: ... [a] --- [b] --- [c] --- [d] --- [e]
大功告成 - 现在你已经并入[x]
变化到 您的.NET 2.0兼容的代码。
您每次在new-dot-net
发生变化时都重复此操作。 比方说,更多的功能被添加:
new-dot-net: ... [a] --- [b] --- [x] --- [y] --- [z]
拉他们到old-dot-net
后你会得到
[x] --------------.---- [y] --- [z]
/ \
old-dot-net: ... [a] --- [b] --- [c] --- [d] --- [e]
你现在合并[e]
和[z]
:
[x] --------------.---- [y] --- [z]
/ \ \
old-dot-net: ... [a] --- [b] --- [c] --- [d] --- [e] ----------- [f]
的重要组成部分记是这些:
- 作出任何新功能在
new-dot-net
。
- 拉变成
old-dot-net
- 从不强迫从
old-dot-net
到new-dot-net
。
你应该在某个时候发现,在new-dot-net
一个变化是old-dot-net
需要不 ,那么你仍然需要把它拉在和合并 它。但是,你会做一个虚拟合并。如果磁头[w]
和 [g]
,并且要保持[g]
,然后做
% HGMERGE=true hg merge -y
% hg revert --all --rev g
% hg commit -m 'Dummy merge with y.'
的trick是做合并,而无需关心结果, 然后恢复所有的变更,并提交不变的工作副本 合并。这样你告诉世界“[w]
和 [g]
的组合是[g]
”,即你丢弃[w]
中的变化。新增 之后new-dot-net
所作的更改[w]
之后可以合并为 正常。
所以你不会使用分支机构?为什么不? – kitsune 2009-05-28 10:40:15