74

...所以我已经习惯了 Mercurial ( add, commit, diff) 的简单内容,并了解了 .hgignore 文件(耶!)并掌握了创建和在分支之间切换的窍门 ( branch, update -C)。

我有两个主要问题:

  1. 如果我在分支“Branch1”中并且我想从分支“Branch2”中提取一些但不是全部的更改,我该怎么做?特别是如果所有更改都在一个子目录中。(我想我可以克隆整个存储库,然后使用像 Beyond Compare 这样的目录合并工具来挑选和选择我的编辑。似乎应该有一种方法来隔离一个文件或一个目录中的更改。)

  2. 在分支之间切换update -C似乎很容易,我想知道为什么我会费心使用clone. 我只能想到几个原因(见下文)——还有其他一些我想念的原因吗?

    一种。如果我需要一次对两个版本/分支采取行动(例如,做一个性能指标差异)

    湾。用于备份(clone存储库到物理上不同位置的网络驱动器)

    C。像我上面提到的那样进行选择合并。

4

3 回答 3

50

我将克隆用于:

  • 短命的地方分支机构
  • 克隆到不同的开发机器和服务器

前一种用途对我来说非常罕见——主要是当我尝试一个我可能想要完全放弃的想法时。如果我想合并,我会想合并所有的更改。这种分支主要是为了跟踪不同开发者的分支,这样它们就不会互相干扰。只是为了澄清最后一点:

  • 我一直致力于我的更改,并拉动我的开发人员同事的更改,他们拉动我的。
  • 当我方便时,我会将这些分支中的一个(或全部)的所有更改合并到我的中。

对于功能分支或寿命更长的分支,我使用命名分支,它们可以在存储库之间更轻松地共享而无需合并。当您想要有选择地合并时,它也会“感觉”更好。

基本上我是这样看的:

  • 命名分支用于开发应用程序的不同分支或版本
  • 克隆用于管理对同一版本的应用程序的不同贡献。

这是我的看法,尽管这确实是一个政策问题。

于 2009-01-15T23:09:47.113 回答
29

对于问题 1,您需要更清楚地了解“更改”的含义。您指的是以下哪一项:

  1. “我想将不同分支中的一些(但不是全部)变更集拉到这个分支中。”
  2. “我想将不同分支中的一些文件的最新版本,但不是全部,拉到这个分支中。”

如果您的意思是第 1 项,您应该查看移植扩展,特别是挑选几个变更集的想法。

如果您的意思是第 2 项,您将执行以下操作:

  • 更新到要将更改拉入的分支。
  • 用于hg revert -r <branch you want to merge> --include <files to update>将这些文件的内容更改为它们在另一个分支上的方式。
  • 用于hg commit将这些更改作为新的变更集提交到分支。

至于问题2,我从不使用存储库克隆来分支自己,所以我不知道。我使用命名分支或匿名分支(有时带有书签)。

于 2009-07-25T21:20:40.500 回答
3

我还有另一种选择供您研究:可变队列。

这个想法是,在您当前的工作目录之上有一堆补丁(没有提交,“真正的”补丁)。然后,您可以添加或删除应用的补丁,添加一个,删除它,添加另一个,等等。一个补丁或其中的一个子集最终成为一个新的“功能”,就像您可能想要对分支做的那样。之后,您可以照常应用补丁(因为它是更改)。如果您与其他人一起工作,分支可能会更有用......?

于 2009-01-15T23:07:04.293 回答