Mercurial:在提交之间移动修改后的文件

Mercurial: Move a modified file between commits

假设我有以下提交历史:

A - newest
B
C - oldest

我在 B 中更改了文件 foo,但我想将更改从 B 移动到 A。

如何使用 hg 做到这一点?

我能想到几种不同的方法。两者都有一些适度的用户要求(请确保您已备份或先推送到 non-publishing 存储库)。

1 ) 使用 histedit 并修改(需要启用每个扩展)。

- copy file you wish to move to a safe location
- run hg histedit and edit changeset b and restore file to its original state
- run hg histedit --continue to commit changes.
- copy file from safe location to repository
- run hg amend to append file to changeset A

2 ) 使用 split 和 histedit。

- run hg split -r b

    - split out all but the file you wish to move into a new changeset

    - create a new changeset onto of that containing the fie (give it a temporary description)

- run hg histedit

    - move the temp change above A

    - roll the temp change into A

3 ) 使用hg-evolve取消提交/修改。虽然这是一种有点高级的方法,但我自己更喜欢这种方法。

- run hg update B

- run hg uncommit and select the file you wish to move.

- run hg evolve to correct the stack

- run hg update A

    Note: if you get a warning about needing to use --clean use hg shelve before
            running the update followed by hg unshelve afterwords.

- run hg amend to add file to change A

4 ) 使用 hg 取消提交变更集 A 和 B 的所有内容,然后使用 hg commit -i 重新提交以使用所需内容重新组装变更集。

可能还有许多其他方法,但这就是我想到的。

这是一个简单但实​​用的方法,可能适合那些对一些更高级的 HG 命令不是很熟悉的人:

  1. 确保您的工作目录是干净的(没有变化)。

  2. hg update -r C

  3. hg revert -r B

  4. hg commit ... 根据需要,但忽略针对 A 的更改。这将创建 B'.

  5. hg shelve ...存储未提交的更改

  6. hg revert -r A

  7. hg unshelve ... 恢复未提交的更改,将它们合并到工作目录中

  8. hg commit ... 创建 C'.

  9. hg strip -r B ...(可选!)

(上面写着 -r A 的意思是使用与 A 相对应的版本号)

解释:我们只是创建两个(或更多)全新的变更集,然后删除原始变更集(这是可选的)。

我们使用 revert 基本上是指“从一些变更集复制到工作目录”,我发现这在很多情况下都非常方便。

在这些操作之后——但在使用 strip 之前——历史看起来像:

   *
   |
A  A'
|  |
B  B'
|/
C

strip只会删除A, B.