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 命令不是很熟悉的人:
确保您的工作目录是干净的(没有变化)。
hg update -r C
hg revert -r B
hg commit
... 根据需要,但忽略针对 A
的更改。这将创建 B'
.
hg shelve
...存储未提交的更改
hg revert -r A
hg unshelve
... 恢复未提交的更改,将它们合并到工作目录中
hg commit
... 创建 C'
.
hg strip -r B
...(可选!)
(上面写着 -r A
的意思是使用与 A
相对应的版本号)
解释:我们只是创建两个(或更多)全新的变更集,然后删除原始变更集(这是可选的)。
我们使用 revert
基本上是指“从一些变更集复制到工作目录”,我发现这在很多情况下都非常方便。
在这些操作之后——但在使用 strip
之前——历史看起来像:
*
|
A A'
| |
B B'
|/
C
和strip
只会删除A
, B
.
假设我有以下提交历史:
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 命令不是很熟悉的人:
确保您的工作目录是干净的(没有变化)。
hg update -r C
hg revert -r B
hg commit
... 根据需要,但忽略针对A
的更改。这将创建B'
.hg shelve
...存储未提交的更改hg revert -r A
hg unshelve
... 恢复未提交的更改,将它们合并到工作目录中hg commit
... 创建C'
.hg strip -r B
...(可选!)
(上面写着 -r A
的意思是使用与 A
相对应的版本号)
解释:我们只是创建两个(或更多)全新的变更集,然后删除原始变更集(这是可选的)。
我们使用 revert
基本上是指“从一些变更集复制到工作目录”,我发现这在很多情况下都非常方便。
在这些操作之后——但在使用 strip
之前——历史看起来像:
*
|
A A'
| |
B B'
|/
C
和strip
只会删除A
, B
.