在处理其他事情时,如何将一堆未提交的更改放在一边

时间:2012-07-17 09:52:25

标签: mercurial

如果我有一堆未提交的更改,并希望在处理其他内容时将其置于一边,然后稍后(f.i.几天后)再回到它并继续工作。完成此任务最简单的工作流程是什么? (到目前为止,我只有使用Mercurial的基本功能)。我通常的方法是使用clone创建一个新的分支,但可能有更好的方法。

4 个答案:

答案 0 :(得分:125)

你有一些选择:

  1. Shelve项目。这将保存更改并将其从工作目录中删除,以便分支可以继续。它不会创建更改集。

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

    更新/修改:较新版本的mercurial可能需要使用

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

    您仍然可以使用--name替代-n,但mercurial似乎不再喜欢--name。此外,--all不再是必需的,并且mercurial实际上会对此感到不满。

  2. Patch queue使用mq的项目。这在某些方面与搁置并不太相似,但表现不同。最终结果相同,删除更改并可以在以后重新应用。推送时,补丁是逻辑更改集,弹出时会将其保存到其他位置,而不是更改集历史记录的一部分。

    hg qnew "UnfinishedWork"
    hg qrefresh
    hg qpop
    
    hg qpush "UnfinishedWork"
    
  3. 在本地提交,更新到上一个更改集并继续工作并使用匿名分支(或多个分支)。如果您想要更改,则可以合并头部。如果您不想进行更改,可以strip更改集。

    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>
    
  5. 我个人使用选项3或4,因为我不介意剥离更改集或签入部分代码(只要最终不会被推送)。这可以与新的Phase内容结合使用,以便在需要时隐藏其他用户的本地更改集。

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

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

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

答案 1 :(得分:23)

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

  1. 我不喜欢克隆分支,因为我喜欢每个项目只有一个目录。同时处理不同的目录完全混淆了编辑器最近文件的历史。我总是最终改变错误的文件。所以我不再这样做了。
  2. 我使用shelve进行快速修复(只是为了将我的未经修改的更改移到另一个分支,如果我发现我错了)。你说的是几天,我绝不会搁置几天。
  3. 我认为mq对于这种普通的情况来说太复杂了
  4. 我认为最好的方法是简单地提交更改,而不是在开始这些更改并从那里开始工作之前返回更改集。有一些小问题,让我说明一下:

    假设您有变更集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分支的阶段更改为secret。秘密变更集不会被推送。

    hg phase -r new-stuff --secret --force
    

答案 2 :(得分:10)

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

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

当你需要回到以前的状态时:

hg up <REV_WHERE_SAVED>
hg patch --no-commit /tmp/<REV_WHERE_SAVED>.patch

答案 3 :(得分:6)

您可以多次克隆您的回购。我倾向于有一个根克隆,然后有多个孩子。例如:

  • MyProject.Root
  • MyProject.BugFix1
  • MyProject.BugFix2
  • MyProject.FeatureChange1
  • MyProject.FeatureChange2

4个孩子都是从根部克隆出来的,然后向/从根部推/拉。根然后根据网络/互联网上的主回购推送/拉出。根作为您的个人临时区域。

所以在你的情况下,你只需要克隆一个新的仓库并开始工作。让你的'搁置'工作单独留在另一个回购中。就这么简单。

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

[编辑以下评论]: -

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