mercurial 的最佳实践:分支与克隆,以及部分合并?

Posted

技术标签:

【中文标题】mercurial 的最佳实践:分支与克隆,以及部分合并?【英文标题】:best practices in mercurial: branch vs. clone, and partial merges? 【发布时间】:2010-10-01 16:55:00 【问题描述】:

...所以我已经习惯了 Mercurial 的简单内容(addcommitdiff)并发现了 .hgignore 文件(耶!)并掌握了创建的窍门并在分支之间切换(branchupdate -C)。

不过,我有两个主要问题:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

【参考方案2】:

我将克隆用于:

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

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

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

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

基本上我是这样看的:

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

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

【讨论】:

为什么在它明显没有抓住问题的重点的情况下被接受和投票这么多次?它没有回答 1,也没有回答 2,而史蒂夫的回答实际上是正确的。 @mare 满怀希望,因为 OP 发现它很有用。有时对一个问题有不止一个观点,*** 旨在让最能解决 OP 问题的答案获得赞誉(通过被接受),而对社区最有用的答案获得赞誉(通过投票)。一个有用的答案总是不是最直接的答案,只要它解决了问题背后的根本原因。在这种情况下,人们在现实生活中问过我类似的问题,我在这里分享的信息是他们认为最有帮助的,所以我认为在这里也可能会有所帮助。 @mare,我投了赞成票,因为我通过 Google 登陆了这个页面,它解决了 我的 问题。【参考方案3】:

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

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

【讨论】:

我不得不说,尽管我想爱 MQ 并且这似乎是一个好主意,但在实践中我发现它们完全行不通。在两台不同的机器上工作是一件痛苦的事——失去了源代码控制的一个主要优势。 这是我的抱怨。您仍然无法在 ./.hgsub 文件中添加 ./.hg/patches 存储库。当我在通用的基础上对特定客户端进行自定义时,我会使用 MQ,但最终我会得到多个命名的补丁文件夹(patch-clienta、patch-clientb 等)。这对我一个人工作来说很好,但我仍然很难看到我们如何在我的日常工作中有效地集成 MQ。克隆可能意味着克隆主存储库和 3 或 4 个补丁队列存储库。

以上是关于mercurial 的最佳实践:分支与克隆,以及部分合并?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用bazaar,mercurial或git进行部分克隆/分支?

mercurial 将一个分支设置为新的默认分支

在推送之前丢弃 Mercurial 中的本地分支

如何在 Mercurial 中克隆存储库的子文件夹?

创建新的 mercurial 存储库克隆 SINCE 修订版

Mercurial摆脱糟糕的合并