如何在没有交互模式的情况下还原Git中更改的单行? (用于交互式How can I restore only a few lines from a file recorded in a given commit?)。
我需要类似的东西:
{{1}}
我可以使用一些第三方工具。
答案 0 :(得分:1)
这个问题可以通过两种方式解释,它们有不同的解决方案。
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
如果目标是简单地用原始文件中的行号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
这将编辑所需的文件(就地),将所需的行替换为从原始文件中提取的相应行。
请注意,这并未考虑当前文件中的行可能与原始文件中的行不在同一位置(由于其间添加/删除了行)。如果行本身是添加或删除,它也将失败。