【问题标题】:In mercurial, how do I apply a reverse-patch to a particular file?在 mercurial 中,如何将反向补丁应用于特定文件?
【发布时间】:2010-11-08 08:15:40
【问题描述】:

Mercurial: Merging one file between branches in one repo 相关,我正在尝试对单个文件执行撤销操作,即使该文件是被撤销的修订的众多参与者之一。

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

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

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

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

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

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

【问题讨论】:

  • --reverse 选项是 patch,而不是 hg patch

标签: mercurial rollback


【解决方案1】:

我会这样做:使用最新版本的新克隆。

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}

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

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

【讨论】:

    【解决方案2】:

    您可以只使用-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
    

    【讨论】:

    • 我想我理解这个解决方案,但这个案例似乎比我的更简单,因为在这里你要退出(其中一个文件)提示更改,而 balpha 处理我更一般的情况退出历史变化。
    • Naw,这对于非提示变更集可以正常工作,尽管它需要您在最后进行“hg 合并”。但是,您仍然会得到一个准确反映发生的事情和变更集亲子关系的历史图表,这与 balpha 的 copy-it-over 不同,后者会产生线性变更日志。
    • 酷。如果您要发布一个取消隐藏更改的示例,我会将其标记为正确。
    【解决方案3】:

    使用还原命令。

    hg revert -r1 file
    

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

    【讨论】:

    • 您可以像这样将文件重置回早期版本是正确的。如果文件自坏版本以来没有更改,它甚至可以在这里工作。但是,如果进行了更多编辑,那么简单的还原将不起作用。相反,您必须更新到错误的版本,将文件恢复为好的版本,提交并合并两个头。我相信这基本上就是退出为您所做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多