Git还原所有匹配模式的行

时间:2017-09-14 09:57:53

标签: git

enter image description here

我错误地替换了Git跟踪的文档中的所有内容和保存行。我之前做过一些工作并忘记在执行此操作之前作为检查点提交,因此恢复是不可取的,因为它会恢复我的所有工作。我想使用Git的帮助只恢复替换所有操作。

我知道我需要恢复的所有行,因为它们都有相同的新行。从像SourceTree这样的GUI工具我可以逐个点击Discard Hunk,但是我想丢弃很多这样的位置。我想要恢复的所有地方都有新的行

m_Sprite: {fileID: 21300164, guid: 791de2a5646d94a15a09bb1d7e79a0e6, type: 3}

但旧线不一定是必要的。 (实际上我将这两种旧行更改为相同的新行)是否有任何脚本方式来匹配更改行的模式,以便我可以有选择地将它们全部还原?谢谢。

以交互方式使用git add -p添加除了我不想要前进的大块头之外的所有内容非常繁琐,因为它会逐一询问你,但是有很多作品要添加,同时我不想要的帅哥几乎每个文件都混在一起。 (所以我必须非常小心git问的每一个问题)同样适用于git checkout -p去除我不想倒退的帅哥。

1 个答案:

答案 0 :(得分:3)

好的,我设法使用补丁修复了问题。

首先,我把这个乱糟糟的状态作为检查点。然后我可以使用

生成一个这种状态的补丁(我想要恢复的替换线以及我不想丢失的所有工作)以及之前的提交(记住正确的行)

git diff --binary HEAD^ HEAD > ~/Desktop/patch.diff

请注意,先前的提交首先出现在命令中。

将补丁保存在某个地方后,我会将其重置为上一次提交并git clean -f。现在,如果我git apply patch.diff我会到达同一点(但仍然保持先前的提交)这个想法是在申请之前直接编辑补丁。

补丁由帅哥组成,因此要禁用某个大块,我不希望这种方法是将+行替换为前一个-行。我可以在VSCode中使用正则表达式搜索来搜索带有\n的多行(不要忘记将+字符转义为\+,这样它就不算作正则表达式)并将它们全部替换掉​​。

这种方法比移除帅哥更好,因为没有机会破坏补丁的格式。补丁不知道它是否正在变换为同一行,什么都不做。

enter image description here

在编辑补丁并应用之后,我得到了所有的更改,减去了我们之前编辑的帅哥。所以它等于“恢复我不想要的所有帅哥”的行为。