在Subversion的旧时代,我有时会使用svn copy
从现有文件中获取新文件。然后,如果在他们共同的部分中发生了某些变化,我仍然可以使用svn merge
来更新派生版本。
要使用hginit.com中的示例,请说“guac”配方已经存在,我想创建一个“superguac”,其中包含有关如何为1000名狂热的足球迷提供鳄梨酱的说明。使用我刚才描述的过程,我可以:
svn cp guac superguac
svn ci -m "Created superguac by copying guac"
(edit superguac)
svn ci -m "Added instructions for serving 1000 raving soccer fans to superguac"
(edit guac)
svn ci -m "Fixed a typo in guac"
svn merge -r3:4 guac superguac
因此错字修正将应用于superguac。
Mercurial提供了一个hg copy
命令,用于将文件标记为原始文件的副本,但我不确定存储库结构是否支持类似的工作流程。这是相同的例子,我只仔细编辑我想在合并中使用的提交中的单个文件:
hg cp guac superguac
hg ci -m "Created superguac by copying guac"
(edit superguac)
hg ci -m "Added instructions for serving 1000 raving soccer fans to superguac"
(edit guac)
hg ci -m "Fixed a typo in guac"
我现在想将guac中的变化应用于superguac。那可能吗?如果是这样,那么正确的命令是什么? Mercurial中是否有不同的工作流程可以实现相同的结果(仅限于一个分支)?
答案 0 :(得分:9)
没有纯粹的mercurial方式与您的补丁交叉文件,但如果您的系统上安装了patch
,您可以通过以下方式跟进您的一系列mercurial命令来实现基本相同的事情:
hg log -p -r tip -I quac | patch superquac
这基本上是说:“在最近的变更集(-p
)中采用应用于文件 quac (-I quac
)的差异(-r tip
)将其发送到标准输出(hg log
),并将其用作作用于文件 superquac (| patch
)的补丁(superquac
)命令的输入。< / p>
答案 1 :(得分:6)
您可以通过
执行此操作hg cp guac superguac
hg ci -m "Created superguac by copying guac" # CS1
(edit superguac)
hg ci -m "Added instructions for serving 1000 raving soccer fans to superguac" # CS2
hg up -r revision-before-copy
(edit guac)
hg ci -m "Fixed a typo in guac" #CS3
hg merge # this will transfer the typo-fix both to guac and superguac
hg ci -m "merged typo-fix from guac" # CS4
此后,存储库看起来像这样
CS1 <--- CS2 <--------- CS4
\ /
\--<-------- CS3 -<-/