如何保持本地mercurial存储库中未提交的更改,同时仍然推/拉?

时间:2011-06-17 23:34:43

标签: eclipse mercurial shelve

如果我正在处理一些我不想提交的文件,我只是保存它们。然后我有其他文件要推送到服务器,但是如果其他人对存储库进行了更改,并且我将它们拉下来,它会要求我合并或重新绑定.. 但这些选项中的任何一个都会导致我丢失我没有提交的本地更改

其他人在做什么来解决这个问题?我发现搁架扩展的文档很难理解。

注意:我正在使用Mercurial Eclipse来推送文件到服务器或从服务器中提取文件。

对此的任何解释将不胜感激!谢谢!


示例:

我在Mercurial Eclipse的网站上工作。我有一个新文件夹和新文件,我不想提交到服务器。我还修改了一些现有文件,我不想让这些更改生效。

然后我网站上的某些内容中断了,我需要修复它,它不会让我修复它而不用更新或合并最新的回购提示,这将导致我丢失所有未提交的更改。

如果我不想丢失,我应该如何处理我编辑过的新文件夹和文件?重新克隆似乎很乏味。将文件复制到新文件夹似乎也很乏味。我确信Shelving或MQ会做我想做的事情,我只是不知道如何去做。

2 个答案:

答案 0 :(得分:3)

参考你的例子情况,这就是我要做的事情(遵循Ry4an的策略,只提交你当前正在处理的事情,但不想发布):

假设你开始在像这样的存储库中工作:

$ hg status -A
C f1
C f2
$ hg glog
@  changeset:   1:7f3c6c86a92f
|  tag:         tip
|  summary:     add f2
|
o  changeset:   0:03ca1e6d5b86
   summary:     initial

即有2个文件和2个提交/更改集。你做了一些工作,比方说添加一个新功能,然后你的工作副本可能如下所示:

$ hg status
M f2
? f3
? f4

有2个新文件和1个修改过的文件。现在,您必须修复一个错误,您还需要在远程存储库中进行任何新的更改。通过提交并拉动远程更改来快照当前工作(按照您的顺序执行操作并不重要,默认情况下拉动不会触及工作副本的状态):

$ hg commit -A -m "snapshot feature work"
$ hg pull

这可能会产生如下历史记录:

o  changeset:   3:2284ba62de07            <-- just pulled in
|  tag:         tip
|  parent:      1:7f3c6c86a92f
|  summary:     edit f1
|
| @  changeset:   2:4a19d371a04f          <-- your interrupted work
|/   summary:     snapshot feature work
|
o  changeset:   1:7f3c6c86a92f
|  summary:     add f2
|
o  changeset:   0:03ca1e6d5b86
   summary:     initial

现在您可以更新到/ checkout修订版3并开始修复错误:

$ hg update 3
.. fix the bug ..
$ hg commit -m "fix a bug"
$ hg glog --limit 3
@  changeset:   4:5d3d947fb4af
|  tag:         tip
|  summary:     fix a bug
|
o  changeset:   3:2284ba62de07
|  parent:      1:7f3c6c86a92f
|  summary:     edit f1
|
| o  changeset:   2:4a19d371a04f
|/   summary:     snapshot feature work
:

看起来不错,让我们推动您的修复,即让它生效,同时不要发布您的中间工作:

$ hg push -r 4

这会推送导致修订版4的所有更改,即您的错误修正,但本地存储库中没有其他分支。您还可以使用-r .,它指的是您的工作副本的父版本,即您刚刚提交的修订版。

最后,您可以返回功能工作并继续工作:

$ hg update 2
.. work, commit, work, commit ..
.. finally merge with the other branch, e.g. revision 4

这些步骤在命令行上,但我认为将一般概念调整为Eclipse Mercurial插件中的相应点击并不困难。

一些额外的说明:

  • 您可能希望书签您的快照提交,因此您无需使用修订ID或数字。
  • 如果您想稍后在一次提交中发布您的功能,请在完成后使用折叠扩展。

答案 1 :(得分:2)

我相信有人会帮助你找到一个糟糕的解决方法,但最好的方法是改变你的目标 - 只是提交。尚未提交尚未提交的代码。如果您肯定无法遵守历史记录中的频繁提交,请将Mercurial Queues与队列存储库一起使用并提交。然后,您可以弹出更改集,推/拉/合并,然后重新启动它们,所有有价值的工作都将在修补程序队列中提交。