在Mercurial中,我可以将更改从一个文件应用到同一分支中的另一个文件吗?

时间:2010-04-23 18:58:23

标签: mercurial

在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中是否有不同的工作流程可以实现相同的结果(仅限于一个分支)?

2 个答案:

答案 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 -<-/