6

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

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

注意:我正在使用 Mercurial Eclipse 向/从服务器推送和拉取文件。

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


例子:

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

然后我的网站上的某些东西坏了,我需要修复它,它不会让我在不重新设置或与 repo 的最新提示合并的情况下修复它,这将导致我丢失所有未提交的更改。

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

4

2 回答 2

4

参考您的示例情况,这就是我要做的(遵循 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

现在您可以更新/签出修订版 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 或编号。
  • 如果您想稍后在单个提交中发布您的功能工作,请在完成后使用折叠扩展。
于 2011-06-19T20:29:13.947 回答
2

我相信有人会帮助你找到一个糟糕的解决方法,但最好的方法是改变你的目标——只要承诺。尚未提交的代码尚未编写。如果您确实不能忍受在您的历史记录中频繁提交,请使用带有队列存储库的 Mercurial Queues 并提交它。然后,您可以弹出变更集、推/拉/合并,然后将它们推回,所有您有价值的工作都将提交到补丁队列中。

于 2011-06-18T02:47:23.427 回答