如何在处理别的事情的时候放置一堆未提交的更改

如果我有一堆未提交的更改,并且希望将其放在一边,而不是在其他方面进行工作,然后稍后(在几天之后),请返回并继续工作。 什么是最简单的工作stream程来完成这个? (到目前为止,我只有Mercurial的基本function的经验)。 我通常的方法是使用克隆创build一个新的分支,但可能有更好的方法。

4 Solutions collect form web for “如何在处理别的事情的时候放置一堆未提交的更改”

你有一些select:

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

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

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

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

    你仍然可以使用--name作为-n的替代,但mercurial似乎不再喜欢--name 。 此外,所有这一切都不再需要,mercurial实际上会吓倒它。

  2. 修补程序使用mq 排队项目。 这在某些方面并不太相似,但performance方式不同。 最终的结果是一样的,更改将被删除,并可以在稍后重新应用。 当推送时,补丁是逻辑变更集,当被popup时,它们被保存在其他地方并且不是变更集历史logging的一部分。

     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. 提交他们到一个命名的分支。 工作stream程与选项3相同 – 在准备就绪时合并或剥离。

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

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

我还使用rebase命令来移动变更集以避免合并,而合并不会在代码的历史logging中添加任何内容。 合并我倾向于保存重要分支(如发布分支)之间的活动或来自更长寿的function分支的活动。 还有histedit命令我用它来压缩变化集,其中的“讨厌”降低了价值。

补丁队列也是这样做的常见机制,但它们具有堆栈语义。 您推送并popup补丁程序,但是在堆栈中的另一个补丁程序“下面”的补丁程序要求也要推送补丁程序中的补丁程序。

警告 ,与所有这些选项一样,如果文件因您暂时搁置/排队/分支的临时更改而发生更多更改,则在取消搁置/推送/合并时将需要合并parsing。

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

  1. 我不喜欢克隆分支,因为我喜欢每个项目只有一个目录。 同时在不同的目录上工作完全混淆了编辑者最近的文件的历史。 我总是最终改变错误的文件。 所以我不这样做了。
  2. 我使用shelve进行快速修复(只是为了将我的未经改动的更改移动到另一个分支,如果我意识到我错了)。 你说的是几天,我没有办法搁置几天。
  3. 我觉得对于这样一个普通的场合, mq太复杂了

我认为最好的方法是简单地提交您的更改,然后在开始这些更改并从此开始工作之前返回到更改集。 有一些小问题,让我说明一下:

假设你有改变集A.比你开始你的改变。 在这一点上,你想把它搁置一会儿。 首先,做好你的工作:

 hg ci -m "Working on new stuff" 

如果你愿意,你可以添加一个书签,以便以后再回来。 我总是为我的匿名分支创build书签。

 hg bookmark new-stuff 

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

 hg update A 

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

 hg push -r C 

或者你可以改变new-stuff分支的秘密。 秘密变更集不会被推送。

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

为了保持本地的不受限制的更改,最简单的方法就是将它们保存为补丁文件。

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

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

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

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

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

这4个孩子都是从根部克隆出来的,并从根部推/拉。 根然后推/从networking/互联网上的主回购的地方。 根可以作为你个人的分区。

所以在你的情况下,你只要克隆一个新的回购,并开始工作。 把你的“搁置”工作单独在另一个回购。 就这么简单。

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

[编辑下面的评论]: –

总结那么…你在做什么是完全正常的。 我认为这是在以下情况下最好的工作方式:1)它是短暂的2)不需要与其他开发者合作3)这些改变不需要离开你的电脑,直到提交/推送时间。

  • 在Mercurial下次提交时删除所有被删除的文件
  • 如何设置Mercurial用于提交的用户名?
  • 移植与移植
  • 是否有可能在Mercurial中重新打开一个closures的分支?
  • 在Mercurial中使用hg还原
  • 如何删除文件中的变化
  • Mercurial - 如何丢弃所有本地更改,包括未版本控制的文件?
  • closures汞分支
  • Mercurial可以使用.hgignore来忘记文件吗?
  • 如何为所有丢失的文件做Mercurial的“hg remove”?
  • 解决冲突:如何自动接受“他们”的变化?