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

Eri*_*rik 96 mercurial

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

Ada*_*rth 131

你有一些选择:

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

    hg shelve --all --name "UnfinishedChanges"
    
    hg unshelve --name "UnfinishedChanges"
    
    Run Code Online (Sandbox Code Playgroud)

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

    hg shelve -n "UnfinishedChanges"
    hg unshelve "UnfinishedChanges"
    
    Run Code Online (Sandbox Code Playgroud)

    你仍然可以使用它--name作为替代-n,但mercurial似乎--name不再喜欢.此外,--all不再需要它,mercurial实际上会对它感到不满.

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

    hg qnew "UnfinishedWork"
    hg qrefresh
    hg qpop
    
    hg qpush "UnfinishedWork"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在本地提交它们,更新到先前的更改集并继续工作并使用匿名分支(或多个分支).如果您想要更改,则可以合并头部.如果您不想进行更改,则可以删除更改集.

    hg commit -m"Commiting unfinished work in-line."
    hg update -r<previous revision>
    
    hg strip -r<revision of temporary commit>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将它们提交给命名分支.然后工作流程与选项3相同 - 在准备好时合并或剥离.

    hg branch "NewBranch"
    hg commit -m"Commiting unfinished work to temporary named branch."
    hg update <previous branch name>
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 书签可用于帮助选项3 - 您可以使用一个标记来标记您创建的修订以存储更改.他们不能自己完成任务. (2认同)

Raf*_*olo 23

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

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

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

假设您有变更集A.比您开始更改.此时你想把它搁置一段时间.首先,承诺你的工作:

hg ci -m "Working on new stuff"
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以添加书签,以便以后更容易回来.我总是为我的匿名分支创建书签.

hg bookmark new-stuff
Run Code Online (Sandbox Code Playgroud)

在进行这些修改之前,请返回变更集

hg update A
Run Code Online (Sandbox Code Playgroud)

从这里,你工作并生成变更集C.现在你有2个头(B和C),当你试图推动时,你会被警告.您只能通过指定该分支的头部来推送一个分支:

hg push -r C
Run Code Online (Sandbox Code Playgroud)

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

hg phase -r new-stuff --secret --force
Run Code Online (Sandbox Code Playgroud)


map*_*cuk 12

为了保持本地不受约束的更改,对我来说最简单的方法就是将它们保存为补丁文件.

hg diff > /tmp/`hg id -i`.patch
Run Code Online (Sandbox Code Playgroud)

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

hg up <REV_WHERE_SAVED>
hg patch --no-commit /tmp/<REV_WHERE_SAVED>.patch
Run Code Online (Sandbox Code Playgroud)


nbe*_*ans 6

您可以多次克隆您的仓库.我倾向于有一个根克隆,然后有多个孩子.例:

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

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

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

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

[编辑以下评论]: -

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