使用未提交的更改从“hg update”恢复

时间:2014-03-13 22:06:59

标签: version-control merge mercurial

我一直在使用Mercurial遇到以下问题,这非常烦人:

  • 我正在修改A。
  • 我有本地更改,我打算在A之上提交或修改,但还没有。
  • 我想去修订版B,但是我忘了我有本地修改了!
  • 我做hg update B。 Mercurial"帮助"尝试重新定义我的本地更改以在B之上应用。这通常会导致冲突,现在它要求我修复冲突。

但是,我不想解决冲突!我不希望我的本地更改完全适用于B之上。我希望他们留在A,或者作为A之后的新提交,或者根据具体情况修改为A。

有没有办法可以从这种状态中恢复?我唯一知道的方法是

  1. 修复B
  2. 的合并冲突
  3. 返回A,再次发生合并冲突
  4. 再次在A
  5. 修复合并冲突
  6. 在A处提交我的更改并返回B
  7. 这是一项很多工作,而且毫无意义。我不应该修改我的本地更改以在B之上应用,只是再次将它们重新设置为在A之上应用。

    如果没有更好的方法可以从这个错误中恢复,有没有办法hg拒绝在您进行本地更改时进行更新?我从来不想这样做 - 如果我想要我只是提交本地更改并在B之上重新定义它们。

4 个答案:

答案 0 :(得分:7)

在更新某地后返回脏文件有点棘手。 "技巧"是首次更新后确保您的工作副本具有脏文件。

所以在你做完之后

hg update $SOMEWHERE

并发现混乱,因为Mercurial开始打开合并工具,平静地关闭合并工具,然后运行

hg resolve --unmark --all
hg resolve --all --tool internal:local

由于您对其进行了更改而合并的所有文件现在看起来都像在脏工作副本中一样。这包括干净地合并的文件和提示您合并的文件。现在可以更新回来:

hg update $BACK
hg resolve --unmark --all
hg resolve --all --tool internal:local

你现在应该回到你开始的地方。如果您在第一次更新后修改了文件,那么它是您在第二次解析后看到的修改后的版本。这就是您希望在第一次更新后解析文件的原因。

答案 1 :(得分:4)

如果您有任何未提交的更改,

hg update -c将中止更新。

答案 2 :(得分:2)

如果工作目录是脏的,也许答案是避免更新。 以下列方式修改〜/ .hgrc应该有所帮助:

[hooks]
preupdate = test -z "$(hg status)"

答案 3 :(得分:2)

<块引用>

如果没有更好的方法可以从这个错误中恢复过来,有没有办法 当您有本地更改时,让 hg 拒绝进行更新?

将此添加到您的 ~/.hgrc

[commands]
update.check = noconflict

只要没有冲突,这仍然允许 hg update 进行未提交的更改。您还可以调用 hg help config.update.check 以获取其他可能的选项:

"commands.update.check"
  Determines what level of checking 'hg update' will perform before
  moving to a destination revision. Valid values are "abort", "none",
  "linear", and "noconflict". "abort" always fails if the working
  directory has uncommitted changes. "none" performs no checking, and
  may result in a merge with uncommitted changes. "linear" allows any
  update as long as it follows a straight line in the revision history,
  and may trigger a merge with uncommitted changes. "noconflict" will
  allow any update which would not trigger a merge with uncommitted
  changes, if any are present. (default: "linear")