【问题标题】:HG Merge: Outstanding uncommited changesHG 合并:未提交的未提交更改
【发布时间】:2014-04-23 19:41:26
【问题描述】:

我有一个文件,version.txt 和其他文件。我更改了其他文件,但没有触及 version.txt。

所以,我尝试推送一个提交,但看到了 Remote Heads 错误。 (有一个变更集修改了versions.txt 文件)

我先是hg pull,然后是hg update

错误是:abort: crosses branches (merge branches or use --clean to discard changes)

然后我尝试了hg mergeabort: outstanding uncommitted changes (use 'hg status' to list changes)

但我不明白,为什么如果versions.txt不是我修改的,为什么不能合并。

这是我将要做的很多事情,即开发和合并,以保持与主开发存储库的内联。我该如何解决这个问题?

HG 状态:

M printbox/web/printbox/controllers/ct_adm_colas.php
M printbox/web/printbox/controllers/ct_adm_jobs.php
M printbox/web/printbox/controllers/ct_form_configurar_cola.php
M printbox/web/printbox/core/MY_Controller.php
M printbox/web/printbox/css/estilos.css
M printbox/web/printbox/js/js_tablas_colas-jobs_ajax.js
M printbox/web/printbox/models/md_cola.php
M printbox/web/printbox/models/md_job.php
M printbox/web/printbox/views/vw_tabla_colas.php
M printbox/web/printbox/views/vw_tabla_jobs.php
A printbox/web/printbox/core/MY_Model.php
? .idea/.name
? .idea/encodings.xml
? .idea/misc.xml
? .idea/modules.xml
? .idea/printboxweb.iml
? .idea/scopes/scope_settings.xml
? .idea/vcs.xml
? .idea/workspace.xml

EIDT:在遵循建议的修复之前和之后,图表日志如下所示:

o  changeset:   19:e21fa7b131b0
|  tag:         tip
|  parent:      17:54f59f253460
|  user:        JCV
|  date:        Tue Apr 22 12:33:36 2014 -0300
|  summary:     # Modificar nombre de producto para version
|
| @  changeset:   18:a03eaad764cd
|/   user:        Jorge S <js@fusiondev.com.ar>
|    date:        Wed Apr 23 16:28:01 2014 -0300
|    summary:     Eliminar método que no se utiliza.
|
o  changeset:   17:54f59f253460
|  user:        Jorge S <js@fusiondev.com.ar>
|  date:        Mon Apr 21 17:25:23 2014 -0300
|  summary:     Incluir SWHelper en Printbox.php
|


@    changeset:   21:1698791a9310
|\   tag:         tip
| |  parent:      20:3bfa1251da1b
| |  parent:      19:e21fa7b131b0
| |  user:        Jorge S <js@fusiondev.c
| |  date:        Thu Apr 24 13:59:25 2014 -0300
| |  summary:     Merge
| |
| o  changeset:   20:3bfa1251da1b
| |  parent:      18:a03eaad764cd
| |  user:        Jorge S <js@fusiondev.c
| |  date:        Thu Apr 24 13:57:23 2014 -0300
| |  summary:     Commit de archivos
| |
o |  changeset:   19:e21fa7b131b0
| |  parent:      17:54f59f253460
| |  user:        JCV
| |  date:        Tue Apr 22 12:33:36 2014 -0300
| |  summary:     # Modificar nombre de producto 
| |
| o  changeset:   18:a03eaad764cd
|/   user:        Jorge S <js@fusiondev.c
|    date:        Wed Apr 23 16:28:01 2014 -0300
|    summary:     Eliminar método que no se utili
|
o  changeset:   17:54f59f253460
|  user:        Jorge S <js@fusiondev.com
|  date:        Mon Apr 21 17:25:23 2014 -0300
|  summary:     Incluir SWHelper en Printbox.php

【问题讨论】:

  • 做一个hg status,是否列出了任何文件,除了可能带有问号的文件?
  • @LasseV.Karlsen 我更新了
  • 您在本地有未提交的更改,这就是 Mercurial 抱怨的原因。如果您决定更新到不同的变更集,Mercurial 将尝试将您本地未提交的更改与您的工作文件夹父级和您要更新到的变更集之间所做的任何事情“合并”。合并不能对未提交的更改进行,因为合并的行为会修改文件而使它们未提交。那么......这些文件应该被提交吗?如果是这样,那么您应该这样做,然后您可以更新和/或合并。
  • @LasseV.Karlsen 是对的。如果您启用了扩展程序,您还可以搁置本地更改,以便稍后恢复。
  • @LasseV.Karlsen 但我不明白为什么我必须合并。它不是一个分支,它是主线。要求一个愚蠢的解释是不是太过分了?我认为 UPDATE 会带来在 HEAD 变更集中修改的文件。如果没有问题,那么我的本地仓库(我一直在工作的地方)将使用最新的服务器版本进行更新。必须注意的是,在这种情况下,我没有修改远程变更集中的文件

标签: merge mercurial


【解决方案1】:

好的,忘记version.txt,这里不相关。您有 2 个存储库,一个在您的系统上,一个在远程。

当您第一次尝试推送时,您尝试在远程 repo 上发送变更集,但您收到一条错误消息,提示您无法推送第二个 head,除非您发出 --force 选项。这是因为其他人已经打败了你并在同一个分支上推送了一个变更集(修改version.txt)(你称之为主线,实际上也是一个分支,它可能被称为默认)。

您接下来所做的很好,您从远程仓库中提取了更改以解决 2 头问题。这样一来,您将成为默认情况下以 2 个正面结束的人。这很好,很容易解决,我们很快就会解决。

你当前的状态一定是这样的

% hg log --graph
o  changeset:   14:3cfac6413110
|  tag:         tip
|  parent:      10:d573f47ecc2d
|  summary:     vb
|
| @  changeset:   13:d8edfdb0532e
|/   parent:      10:d573f47ecc2d
|    summary:     commit to subr2
|

现在,当您执行 hg update 时,事情变得复杂了,因为 mercurial 注意到您的回购有问题。您将需要通过合并来解决 2 头问题,就像 mercurial 的建议一样。

但是,执行 hg merge 会给您带来第二个错误,这一次是因为您尚未在您的存储库中提交所有更改。现在你有2个选择。当您尝试使用hg status 命令时,您会看到前面带有M 的文件吗?如果您确实修改了它们,并且希望将它们包含在 repo 中,请执行以下操作:

hg commit -m "Committing remaining files"
hg merge
hg commit -m "Merge"

这是提交剩余的更改,合并 2 个头,然后提交合并变更集。 mercurial 不想使用未提交的更改进行更新的原因是出于安全原因。它不希望您放弃当前的工作。这让我想到了第二种选择。但是,如果不需要修改文件中的更改,您可以放弃这些更改。您可能在混乱期间尝试了其他操作,更新了一些文件并使您处于 in-between 状态。如果是这种情况,您可以快速放弃更改并通过执行以下命令来解决问题(丢失更改):

hg update --clean
hg merge
hg commit -m "Merge"

更新将简单地清除存储库,并且可以进行合并。合并提交后,您可以发出最终推送。

hg push

如果你很幸运并且没有人在远程仓库上推送任何其他内容,那么推送应该会成功。否则,您可以再次拉取、合并、提交和推送。

【讨论】:

  • 我试着听从你的建议,我结束了一个不需要的“分支”,我不得不合并,因此在日志中显示了这种方式。我不太清楚为什么必须这样,如果我再次克隆回购,我有最新版本。如果那时我复制修改后的文件,我不必进行合并,只需提交更改。我之前不想提交我的更改,因为它仍在开发中(只是想从另一件事中推送一个小错误修复)。我必须找到一种方法来安全地开发新功能,同时仍然能够更新到 repo 的最后状态
  • @Jorge 功能应该在他们自己命名的分支中开发,至少这是我强烈建议的。当您的功能完成后,您将默认合并回来。 stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2012-08-15
  • 2021-01-29
相关资源
最近更新 更多