如何以非交互方式还原单行?

时间:2018-01-31 08:58:41

标签: git command-line-interface

如何在没有交互模式的情况下还原Git中更改的单行? (用于交互式How can I restore only a few lines from a file recorded in a given commit?)。

我需要类似的东西:

{{1}}

我可以使用一些第三方工具。

1 个答案:

答案 0 :(得分:1)

这个问题可以通过两种方式解释,它们有不同的解决方案。

还原Hunk触摸特定行

grepdiff命令可用于从符合特定条件(硬件索引,行号,内容......)的差异中选择一个块。在这种情况下,它可以用于限制差异,包括特定的行号。然后,生成的(反向)块将发送到patch以应用:

$ git diff -U0 -R -- src/main/MyPreciousFile.txt \
    | grepdiff --lines=107 --output-matching=hunk . \
    | patch -p1

这将生成文件的反向差异,过滤掉触及所需行的大块并应用生成的修补程序。

这可以打包成shell函数:

$ function revert_hunk_touching_line() {
    git diff -U0 -R -- "$1" \
        | grepdiff --lines="$2" --output-matching=hunk . \
        | patch -p1        
}
$ revert_hunk_touching_line src/main/MyPreciousFile.txt 107

请注意,指定的行号与当前文件有关。如果行号应引用原始行中的一行,则需要在另一端进行反转:

$ git diff -U0 -- src/main/MyPreciousFile.txt \
    | grepdiff --lines=107 --output-matching=hunk . \
    | patch -p1 -R

盲目地从Orignal替换特定行

如果目标是简单地用原始文件中的行号x替换当前文件中的行号x,则可以使用sed的函数:

$ function revert_line() {
    sed -i "${2}c\\$(git show ":$1" | sed "${2}q;d")" "$1"
}
$ revert_line src/main/MyPreciousFile.txt 107

这将编辑所需的文件(就地),将所需的行替换为从原始文件中提取的相应行。

请注意,这并未考虑当前文件中的行可能与原始文件中的行不在同一位置(由于其间添加/删除了行)。如果行本身是添加或删除,它也将失败。