20

Mercurial 相关:在一个 repo 中的分支之间合并一个文件,我正在尝试对单个文件执行撤销操作,即使该文件是被撤销的修订的众多参与者之一。

HG 是面向变更集的工具,它不想对文件进行操作。

我能找到的最接近的是使用 hg export 创建一个差异,手动编辑差异,然后 hg import 以相反的顺序修补文件。

..但后来我遇到了这种烦人的情况,http ://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html 声称没有 --reverse 选项hg patch

所以我能想到的最接近的事情是生成一个如上所述的手工编辑补丁,然后使用 vanilla patch -R 应用反向补丁。

hg backout命令在这里似乎很有用,但实际上是一个红鲱鱼。

一定有更好的方法,不是吗?

4

3 回答 3

23

您可以仅使用-I(包括与给定模式匹配的名称) 参数来执行此操作,以使用单行进行回退:

hg backout --merge -I thefiletorevert -m 'message' OFFENDINGREVISIONID

示例脚本:

hg init testrepo
cd testrepo
echo -e "line1\n\nline3" > file1
echo -e "line1\n\nline3" > file2
hg commit -A -m 'changes to two files'
perl -pi -e 's/line1/line 1/' file1
perl -pi -e 's/line1/line 1/' file2
hg commit -m 'put spaces in line1'
perl -pi -e 's/line3/line 3/' file1
perl -pi -e 's/line3/line 3/' file2
hg commit -m 'put spaces in line3'
hg backout --merge -I file1 -m 'remove spaces from line1' 1

样本输出:

adding file1
adding file2
reverting file1
created new head
changeset 3:6d354f1ad4c5 backs out changeset 1:906bbeaca6a3
merging with changeset 3:6d354f1ad4c5
merging file1
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

结果文件内容:

file1:line1
file1:line 3
file2:line 1
file2:line 3

请注意,在中间变更集回退后,file1 在第一行中缺少空间,并且详细日志显示回退中仅更改了一个文件:

$ hg log -v -r tip
changeset:   3:6d354f1ad4c5
tag:         tip
parent:      1:906bbeaca6a3
user:        Ry4an Brase <ry4an@mini>
date:        Mon Sep 14 12:17:23 2009 -0500
files:       file1
description:
remove spaces from line1
于 2009-07-07T04:31:53.240 回答
6

这就是我要做的:使用最新版本的新克隆。

hg backout --merge -r revision_where_the_change_happened

将反向更改合并到工作副本中。

现在将有问题的文件复制到您的常规工作副本并提交

hg commit -m "Reversed the changes to file.h made in revision bla"

并丢弃您在上面创建的克隆。

这样,mercurial 就不知道revision_where_the_change_happened和这个提交之间有联系。如果您希望 mercurial 记住这一点,请改为执行

hg revert {all files except the one in question}

在将回退提交合并到工作副本之后和提交之前。对于第二种方式,您不需要处理克隆,因为您想保留回退提交。

我猜想您使用哪种方式的选择取决于特定文件更改的变更集有多大。

于 2009-07-06T10:24:43.410 回答
4

使用还原命令。

hg revert -r1 file

这应该会将文件的内容恢复为修订版 1 中的版本。然后您可以进一步编辑它并正常提交。

于 2009-07-10T10:04:33.700 回答