102

如果我有一堆未提交的更改并想在处理其他事情时将其搁置一边,然后稍后(几天后)再回来继续工作。完成此任务的最简单工作流程是什么?(到目前为止,我只体验过 Mercurial 的基本功能)。我通常的方法是使用克隆创建一个新分支,但可能有更好的方法。

4

4 回答 4

138

你有几个选择:

  1. 搁置物品。这会保存更改并将它们从工作目录中删除,以便分支可以继续。它不会创建变更集。

    hg shelve --all --name "UnfinishedChanges"
    
    hg unshelve --name "UnfinishedChanges"
    

    更新/编辑:可能需要使用较新版本的 mercurial

    hg shelve -n "UnfinishedChanges"
    hg unshelve "UnfinishedChanges"
    

    您仍然可以--name用作 的替代品-n,但 mercurial 似乎不再喜欢--name了。此外,--all不再需要它,而 mercurial 实际上会吓坏它。

  2. 使用 对项目进行修补排队mq。这在某些方面与搁置并没有太大的不同,但表现不同。最终结果是相同的,更改被删除,并且可以选择在以后重新应用。推送时,补丁是逻辑变更集,弹出时它们保存在其他地方并且不是变更集历史记录的一部分。

    hg qnew "UnfinishedWork"
    hg qrefresh
    hg qpop
    
    hg qpush "UnfinishedWork"
    
  3. 在本地提交它们,更新到以前的变更集并继续工作并使用匿名分支(或多个头)。如果您想要更改,您可以合并磁头。如果您不想要更改,可以剥离更改集。

    hg commit -m"Commiting unfinished work in-line."
    hg update -r<previous revision>
    
    hg strip -r<revision of temporary commit>
    
  4. 将它们提交到指定的分支。然后,工作流程与选项 3 相同 - 准备好后合并或剥离。

    hg branch "NewBranch"
    hg commit -m"Commiting unfinished work to temporary named branch."
    hg update <previous branch name>
    

我个人使用选项 3 或 4,因为我不介意剥离变更集或签入部分代码(只要最终不会被推送)。如果需要,这可以与新的Phase内容结合使用,以向其他用户隐藏您的本地变更集。

我还使用该rebase命令来移动变更集,以避免合并不会向代码历史添加任何内容。合并我倾向于保存重要分支(例如发布分支)之间的活动,或来自寿命较长的功能分支的活动。还有一个histedit我用来压缩变更集的命令,其中它们的“闲聊”会降低价值。

补丁队列也是执行此操作的常用机制,但它们具有堆栈语义。您推送和弹出补丁,但是堆栈中另一个补丁“下方”的补丁要求也推送它上面的补丁。

警告,与所有这些选项一样,如果文件在您搁置/排队/分支的临时更改之后有更多更改,则在取消搁置/推送/合并时将需要合并解决方案。

于 2012-07-17T09:57:05.457 回答
23

就个人而言,我不喜欢到目前为止发布的任何答案:

  1. 我不喜欢克隆分支,因为我喜欢每个项目只有一个目录。同时处理不同的目录完全弄乱了我的编辑最近文件的历史。我总是最终更改错误的文件。所以我不再那样做了。
  2. shelve用于快速修复(如果我意识到我在错误的分支上,只是将我未提交的更改移动到另一个分支)。你说的是几天,我不会搁置几天的东西。
  3. 我认为mq对于这样一个普通的情况来说太复杂了

我认为最好的方法是简单地提交更改,而不是在开始这些更改并从那里开始工作之前返回更改集。有一些小问题,我来说明一下:

假设您有变更集 A。然后开始您的更改。在这一点上,你想把它放在一边。首先,提交你的工作:

hg ci -m "Working on new stuff"

如果需要,您可以添加书签,以便以后更轻松地返回。我总是为我的匿名分支创建书签。

hg bookmark new-stuff

回到这些修改之前的变更集

hg update A

从这里开始,您开始工作并生成变更集 C。现在您有 2 个头(B 和 C),当您尝试推送时会收到警告。您可以通过指定该分支的头来仅推送一个分支:

hg push -r C

或者您可以将new-stuff分支的阶段更改为秘密。不会推送秘密变更集。

hg phase -r new-stuff --secret --force
于 2012-07-25T18:09:35.293 回答
13

为了保持本地未提交的更改,对我来说最简单的方法就是将它们保存为补丁文件。

hg diff > /tmp/`hg id -i`.patch

当您需要返回之前的状态时:

hg up <REV_WHERE_SAVED>
hg patch --no-commit /tmp/<REV_WHERE_SAVED>.patch
于 2014-06-20T16:04:07.273 回答
6

您可以多次克隆您的存储库。我倾向于有一个根克隆,然后从那里有多个孩子。例子:

  • 我的项目根
  • MyProject.BugFix1
  • 我的项目.BugFix2
  • MyProject.FeatureChange1
  • MyProject.FeatureChange2

4 个孩子都是从根目录克隆的,并从根目录推/拉。然后根从网络/互联网某处的主存储库推/拉。根充当您的个人登台区域。

因此,在您的情况下,您只需克隆一个新的存储库并开始工作。将“搁置”的工作单独留在另一个仓库中。就是这么简单。

唯一的缺点是磁盘空间的使用,但如果这是一个问题,那么你根本就不会使用 DVCS ;) 哦,它确实会污染你的 Visual Studio“最近的项目”列表,但是嘿嘿。

[编辑以下评论]:-

总结一下……你正在做的事情是完全正常和正常的。我认为当以下情况属实时,这是最好的工作方式:1)它是短暂的 2)您不需要与其他开发人员合作 3)更改不需要离开您的 PC 直到提交/推时间。

于 2012-07-17T10:24:48.317 回答