如果我有一堆未提交的更改并想在处理其他事情时将其搁置一边,然后稍后(几天后)再回来继续工作。完成此任务的最简单工作流程是什么?(到目前为止,我只体验过 Mercurial 的基本功能)。我通常的方法是使用克隆创建一个新分支,但可能有更好的方法。
4 回答
你有几个选择:
搁置物品。这会保存更改并将它们从工作目录中删除,以便分支可以继续。它不会创建变更集。
hg shelve --all --name "UnfinishedChanges" hg unshelve --name "UnfinishedChanges"
更新/编辑:可能需要使用较新版本的 mercurial
hg shelve -n "UnfinishedChanges" hg unshelve "UnfinishedChanges"
您仍然可以
--name
用作 的替代品-n
,但 mercurial 似乎不再喜欢--name
了。此外,--all
不再需要它,而 mercurial 实际上会吓坏它。使用 对项目进行修补排队
mq
。这在某些方面与搁置并没有太大的不同,但表现不同。最终结果是相同的,更改被删除,并且可以选择在以后重新应用。推送时,补丁是逻辑变更集,弹出时它们保存在其他地方并且不是变更集历史记录的一部分。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>
将它们提交到指定的分支。然后,工作流程与选项 3 相同 - 准备好后合并或剥离。
hg branch "NewBranch" hg commit -m"Commiting unfinished work to temporary named branch." hg update <previous branch name>
我个人使用选项 3 或 4,因为我不介意剥离变更集或签入部分代码(只要最终不会被推送)。如果需要,这可以与新的Phase内容结合使用,以向其他用户隐藏您的本地变更集。
我还使用该rebase
命令来移动变更集,以避免合并不会向代码历史添加任何内容。合并我倾向于保存重要分支(例如发布分支)之间的活动,或来自寿命较长的功能分支的活动。还有一个histedit
我用来压缩变更集的命令,其中它们的“闲聊”会降低价值。
补丁队列也是执行此操作的常用机制,但它们具有堆栈语义。您推送和弹出补丁,但是堆栈中另一个补丁“下方”的补丁要求也推送它上面的补丁。
警告,与所有这些选项一样,如果文件在您搁置/排队/分支的临时更改之后有更多更改,则在取消搁置/推送/合并时将需要合并解决方案。
就个人而言,我不喜欢到目前为止发布的任何答案:
- 我不喜欢克隆分支,因为我喜欢每个项目只有一个目录。同时处理不同的目录完全弄乱了我的编辑最近文件的历史。我总是最终更改错误的文件。所以我不再那样做了。
- 我
shelve
用于快速修复(如果我意识到我在错误的分支上,只是将我未提交的更改移动到另一个分支)。你说的是几天,我不会搁置几天的东西。 - 我认为
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
为了保持本地未提交的更改,对我来说最简单的方法就是将它们保存为补丁文件。
hg diff > /tmp/`hg id -i`.patch
当您需要返回之前的状态时:
hg up <REV_WHERE_SAVED>
hg patch --no-commit /tmp/<REV_WHERE_SAVED>.patch
您可以多次克隆您的存储库。我倾向于有一个根克隆,然后从那里有多个孩子。例子:
- 我的项目根
- MyProject.BugFix1
- 我的项目.BugFix2
- MyProject.FeatureChange1
- MyProject.FeatureChange2
4 个孩子都是从根目录克隆的,并从根目录推/拉。然后根从网络/互联网某处的主存储库推/拉。根充当您的个人登台区域。
因此,在您的情况下,您只需克隆一个新的存储库并开始工作。将“搁置”的工作单独留在另一个仓库中。就是这么简单。
唯一的缺点是磁盘空间的使用,但如果这是一个问题,那么你根本就不会使用 DVCS ;) 哦,它确实会污染你的 Visual Studio“最近的项目”列表,但是嘿嘿。
[编辑以下评论]:-
总结一下……你正在做的事情是完全正常和正常的。我认为当以下情况属实时,这是最好的工作方式:1)它是短暂的 2)您不需要与其他开发人员合作 3)更改不需要离开您的 PC 直到提交/推时间。