如何在处理别的事情的时候放置一堆未提交的更改
如果我有一堆未提交的更改,并且希望将其放在一边,而不是在其他方面进行工作,然后稍后(在几天之后),请返回并继续工作。 什么是最简单的工作stream程来完成这个? (到目前为止,我只有Mercurial的基本function的经验)。 我通常的方法是使用克隆创build一个新的分支,但可能有更好的方法。
你有一些select:
-
搁置物品。 这将保存更改并将其从工作目录中删除,以便分支可以继续。 它不会创build变更集。
hg shelve --all --name "UnfinishedChanges" hg unshelve --name "UnfinishedChanges"
更新/编辑 :更新版本的mercurial可能需要使用
hg shelve -n "UnfinishedChanges" hg unshelve "UnfinishedChanges"
你仍然可以使用
--name
作为-n
的替代,但mercurial似乎不再喜欢--name
。 此外,所有这一切都不再需要,mercurial实际上会吓倒它。 -
修补程序使用
mq
排队项目。 这在某些方面并不太相似,但performance方式不同。 最终的结果是一样的,更改将被删除,并可以在稍后重新应用。 当推送时,补丁是逻辑变更集,当被popup时,它们被保存在其他地方并且不是变更集历史logging的一部分。hg qnew "UnfinishedWork" hg qrefresh hg qpop hg qpush "UnfinishedWork"
-
在本地提交它们,更新到以前的更改集并继续工作,并使用匿名分支(或多个头)。 如果你想要更改,你可以合并头。 如果您不想更改,则可以删除更改集。
hg commit -m"Commiting unfinished work in-line." hg update -r<previous revision> hg strip -r<revision of temporary commit>
-
提交他们到一个命名的分支。 工作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。
就个人而言,我不喜欢到目前为止发布的任何答案:
- 我不喜欢克隆分支,因为我喜欢每个项目只有一个目录。 同时在不同的目录上工作完全混淆了编辑者最近的文件的历史。 我总是最终改变错误的文件。 所以我不这样做了。
- 我使用
shelve
进行快速修复(只是为了将我的未经改动的更改移动到另一个分支,如果我意识到我错了)。 你说的是几天,我没有办法搁置几天。 - 我觉得对于这样一个普通的场合,
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)这些改变不需要离开你的电脑,直到提交/推送时间。