【问题标题】:how can I work on both default and branch at same time in Hg?如何在 Hg 中同时处理默认和分支?
【发布时间】:2011-08-19 12:47:09
【问题描述】:

好的,我一般是 Mercurial 和版本控制分支的新手,所以我可能对这里发生的事情有一个根本的误解——请善待......;)

我们是一个小型开发团队(2 名开发人员),致力于一个项目,我们需要实施一项可能需要数周或数月的重大更改。同时,该程序在日常使用中,因此我们需要定期进行补丁和修复。

由于重大更改的长期运行性质,我从默认分支创建了一个分支(称为 dev1)。我希望定期将默认分支中的更改合并到 dev1 分支中,原因无需在此重复。但是,我不希望 dev1 的更改在开发后期合并到默认分支中。

我尝试了几种不同的方法来做到这一点,但似乎合并总是影响两个分支。合并后,如果我更新到默认值,我现在将 dev1 的更改合并到源中。

我可以使用同一个存储库在两个分支上工作吗?如果是这样,有人可以分享要使用的命令序列吗?如果不是这样,在我看来,在 dev1 分支完成之前,我将无法将它推送到主仓库,这似乎不正确。

我们正在运行适用于 Windows 的最新 TortoiseHg,并且在很大程度上我喜欢图形工具。但是,我非常愿意在必要时使用命令行来执行某些任务。

感谢您的帮助, 戴夫

【问题讨论】:

  • 对于任何可能遇到我遇到的情况的人,这是我解决它的方法。
  • 糟糕。以为我可以在评论中换一个新行,真傻……我克隆了损坏的仓库,更新回 dev1 分支,同时丢弃了所有未提交的更改,瞧!我现在有 2 个独立的分支。然后我清除了我的原始存储库并从“固定”存储库中克隆。不过,我仍然不知道我是如何到达现在的状态的……

标签: windows mercurial merge branch tortoisehg


【解决方案1】:

这取决于您创建的分支类型。

如果您创建了一个命名的分支,并且在单个工作目录中工作,那么您需要使用一个工作流程,但如果您已经克隆了生产存储库,则需要使用不同的工作流程工作流程。

命名分支工作流,单个 repo/工作目录

在这种情况下,您正在使用更新在 default 分支和 dev1 功能分支之间切换。

如果您想在 default 分支上工作,请对其进行更新、修复错误并提交这些更改。不要合并来自dev1 分支的更改。

当你想在 dev1 分支上工作时,更新到它,从默认分支合并你的错误修复,处理你的功能并在完成后提交。

如果您在 dev1 分支上工作,并且您的同事修复了您需要的 default 中的错误,请提交您的工作,获取他们的更改,合并它们,然后继续您的工作(您可以使用快捷方式在这里,但是这样你可以在它变得混乱时退出合并)

注意:所有这些都假设您的所有更改都在您想要在 dev1default 分支之间切换时提交。

需要注意的重要一点是,当您合并它们时,您只能从 default 中的 dev1 分支中获得更改。如果您只将 default 合并到 dev1 中,那么您的功能分支将跟上与default 约会,这样当您准备好将该功能部署到default 分支时,您可以通过一个简单的合并操作来完成。

使用从生产仓库克隆的 dev1 仓库的未命名分支工作流

此工作流程类似,但允许您同时处理 defaultdev1 分支,而无需更新以在两者之间切换。

如果您想在 default 分支上工作,请使用存储库,其中提示是您的生产代码。进行错误修复,并像往常一样提交这些更改。

当您想在 dev1 分支上工作时,请使用存储库,其中提示是您的 dev1 功能分支。如果default 存储库中有修复,请拉入更改并将它们合并到您的克隆中,但不要将合并更改集推回。仅当您要将功能部署到生产代码时才将您的变更集推回。合并来自 default 的变更集后,您可以继续使用该功能。

如果您正在处理 dev1 分支并且同事修复了您需要的 default 中的错误,请提交您的工作,将他们的更改从您的共享存储库中提取到您的 default 生产克隆中,然后提取这些更改进入您的 dev1 功能克隆,将它们合并,然后继续您的工作。

同样,需要注意的重要一点是,只有在将更改推送到default 生产存储库时,才能从default 中的dev1 分支获取更改。如果您只将default 变更集拉/合并到dev1 克隆中,那么您的功能分支将与default 保持同步,以便当您准备将功能部署到default 分支时,您可以这样做只需一个简单的推送操作。

【讨论】:

  • 我正在/正在使用命名分支,感谢您的细分。我相信图形工具并没有做我认为它会做的事情,所以从现在开始我将进入命令行做一些我可以得到的事情......
  • 我将此标记为答案,无论是针对此答案还是对下面其他答案的评论。谢谢!
【解决方案2】:

是的,你完全可以用 Mercurial 做到这一点。

首先,如果您不清楚(我有一段时间不清楚),Mercurial 中有 3 types of 'branches'

  • 克隆存储库
  • “命名分支”(使用hg branch 命令)
  • 一个匿名分支,您可以使用书签或仅记住变更集来管理它

我猜你使用了hg branch 方法。请注意,这通常不是您想要的,因为该分支名称将永远存在于 repo 的历史中(嗯,有 --close-branch 选项,但仍然......)。

基本的工作流程是:

  • 使用hg up devbranch 更新到 dev 分支
  • 提交更改到开发分支
  • 根据需要通过hg merge defaulthg merge 与主分支合并
  • (根据需要重复)

在默认分支上工作:

  • 使用hg up default 更新到默认分支
  • 提交更改
  • (根据需要重复)

不要这样做:

  • 使用hg up default 更新到默认分支
  • hg merge 合并开发分支

我怀疑您在使用命令hg merge 时没有指定分支名称。这将与任何其他头部合并,这可能是也可能不是你想要的。

编辑:以上信息可能不是您的问题。当您当前的分支是默认分支时,您的问题可能是运行合并。

不想想从你的默认分支运行hg merge

【讨论】:

  • 当默认是我当前的分支时,我非常小心不要进行合并,但我仍然设法破坏了默认分支。我从图形工具中进行了合并,我相信这可能是我的问题。
  • @DaneN59 - 在 TortoiseHG 中,如果您使用错误菜单中的上下文菜单启动合并,很容易意外地将 default 合并到 dev1 而不是 dev1default。我怀疑这就是你可能正在做的事情——我知道我已经做过几次了。 *8') 诀窍是查看链接线的连接方式。
  • 谢谢。正如你所说,我一定是在不知不觉中做到了这一点,但我认为我非常小心,不要...
【解决方案3】:
# bang on dev1
# more banging on dev1
# someone beats on default for a while
# update to dev1
hg up dev1
# bring in the changes from default
hg merge -r default
# validate successful merge
hg commit -m "merging"

当您将更改从默认值带入时,关键是在 dev1 上提交。

请注意,我在这里使用命名分支。

【讨论】:

  • 是的,我试过了。然后我更新到默认分支,并且我有许多未提交的更改——来自 dev1 分支。我只是安装了损坏的 TortoiseHg 还是什么?
  • 如果您在 dev1 分支上提交,并更新到默认分支,并且有未提交的更改,那么您在离开 dev1 之前没有提交所有内容。如果你有,恢复默认的更新会给你一个原始的工作文件夹。
  • 我会告诉你的,但我是如何获得部分提交的?这就是现在让我感到困惑的事情......
  • @Dave:你需要在交换之前提交。如果您使用的是 TortoiseHG gui,我建议您暂时避免这种情况并坚持使用命令行 - gui 会为您做出一些决定(例如,作为合并对话序列的一部分提交)。
【解决方案4】:

这句话:

合并后,如果我更新到默认值,我现在将 dev1 的更改合并到源中。

告诉我你做错了什么。您想做的事情完全可以实现,并行处理两个分支,并从一个分支合并到另一个分支,而不影响两者。

重要的是要知道合并是定向合并。您将 from 一个分支 to 合并到另一个分支,当您启动合并时,您应该 on to -分支。

direction 方向在结果中发挥作用。对于文件的实际内容,合并的方向无关紧要,但是您提交的新合并变更集将位于您启动合并时所在的分支上(除非您覆盖。)

所以,首先更新到dev1 的头部,然后与default 合并,提交后,你应该在dev1 分支上有一个新的变更集,但default 应该保持不变。

【讨论】:

  • 我知道这个先决条件,我以为我做到了。尽管如此,我还是设法破坏了默认分支。
【解决方案5】:

这更像是一个提示而不是一个答案,但是......

我经常使用这个工作流程。我发现Transplant 扩展对于命名分支工作流非常有用。 TortoiseHg 支持它,因此您可以在 TortoiseHg 选项中启用它。它可以让你从其他分支中挑选,这非常有用——尤其是当你经常提交到错误的分支时。

【讨论】:

  • @DaveN59 - 我不会打扰。 transplantrebase 是(恕我直言)为解决预分布式 VCS 系统中有限的分支功能而设计的工作流遗留问题。合并可以清楚地指示您在重新设置或移植变更集时丢失的变更的真实历史。
  • @Mark Booth - 我想您有权获得该意见。您将如何使用合并完成移植所做的任务,即。你如何选择只使用合并......也许你认为我建议只使用移植......
  • @Mark Booth:虽然我同意 transplantrebase 不是 DaveN59 问题的解决方案,但它们仍然是非常有用的扩展而不是“遗留”,IMO。在处理您无法控制的上游存储库时,它们通常最有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
相关资源
最近更新 更多