Git 恢复某一文件到指定版本

问题描述

今天我查看之前的写的文章的时候我发现'批处理 for命令.md'这批文章中的大部分内容都丢失了,应该是我写的文件处理程序出bug造成的,不过幸好有版本控制,只要将该文件恢复到文件处理程序操作之前的状态即可.

查看某个文件的commit记录

格式:

1
git log --pretty=oneline 文件路径

例如:先cd到'批处理 for命令.md'这个文件所在的目录,然后输入如下命令,查看该文件的提交记录.

1
git log --pretty=oneline '批处理 for命令.md'
1
2
3
4
5
6
7
8
9
10
11
lan@DESKTOP-8ISAT6B MINGW64 /e/Blog/blog/source/_posts/Windows/CMD 批处理/语法/构建程序相关命令 (master)
$ git log --pretty=oneline '批处理 for命令.md'
3306a587de0ee6adcf93b06c02fcdb516b3518a8 (HEAD -> master, origin/master, origin/HEAD) 添加新的文章,添加新的批处理文件
8a373f61d04c84cae3baf38926fafb4edc7792d1 更新目录摘要
f9d10aa3896969a9b156079ff4036e08f37e48e0 添加目录摘要
ee428318f7e27468239b0df33696860fe869e1e0 删除自定义FM
65103097ba7830ba0b47b0123dd6e7abaa090299 删除原文链接
4a7e71d88ef2c2272baa3a48fc33bf4965a9b1a7 更新目录摘要
b8abfe524937e2d8f63c7fa607f6afb8812cb5d7 调整文章路径,添加新的文章

lan@DESKTOP-8ISAT6B MINGW64 /e/Blog/blog/source/_posts/Windows/CMD 批处理/语法/构建程序相关命令 (master)

比较两个版本之间文件的不同

1
git diff commit_id1 commit_id2 -- 文件名

注意这两个commit_id的顺序不同显示不同.commit_id1应该为更久远的版本,commit_id2应该为更近的版本.
所以格式简化为:

1
git diff 旧版本commit_id 新版本commit_id -- 文件名

因为我不知道什么时候文件内容丢失的,所以从最久远的版本开始,一级一级的向上比较,看看究竟是哪个版本出现的问题.

先来比较4a7e71d88e版本(倒数第二久远版本),对b8abfe5249(最久远版本)做了哪些修改:

1
git diff b8abfe5249 4a7e71d88e -- '批处理 for命令.md'

运行效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
lan@DESKTOP-8ISAT6B MINGW64 /e/Blog/blog/source/_posts/Windows/CMD 批处理/语法/构建程序相关命令 (master)
$ git diff b8abfe5249 4a7e71d88e -- '批处理 for命令.md'
diff --git a/source/_posts/Windows/CMD 批处理/语法/构建程序相关命令/批处理 for命令.md b/source/_posts/Windows/CMD 批处理/语法/构建程序相关命令/批处理 for命令.md
index 11f5b2b..52811fc 100644
--- a/source/_posts/Windows/CMD 批处理/语法/构建程序相关命令/批处理 for命令.md
+++ b/source/_posts/Windows/CMD 批处理/语法/构建程序相关命令/批处理 for命令.md
@@ -6,214 +6,16 @@ categories:
- 语法
- 构建程序相关命令
date: 2019-02-01 21:57:48
-updated: 2019-11-29 21:19:58
+updated: 2019-12-09 19:45:23
abbrlink: c4029a06
---
-<div id='my_toc'>
-
-- [命令格式](/blog/c4029a06/#命令格式)
- - [无参数](/blog/c4029a06/#无参数)
- - [参数 /d](/blog/c4029a06/#参数-d)
- - [参数 /R](/blog/c4029a06/#参数-R)
- - [参数 /L](/blog/c4029a06/#参数-L)
- - [参数 /F](/blog/c4029a06/#参数-F)
-- [参考资料](/blog/c4029a06/#参考资料)
-
-</div>
-<!--more-->
-<script>if (navigator.platform.search('arm')==-1){document.getElementById('my_toc').style.display = 'none';}</script>
+<div id='my_toc'>    <a href="/blog/c4029a06/#参考资料">参考资料</a><br/></div><!--more-->
+<script>if (navigator.platform.search('arm')==-1){document.getElementById('my_toc').style.display = 'none';}
+var e,p = document.getElementsByTagName('p');while (p.length>0) {e = p[0];e.parentElement.removeChild(e);}
+</script>

<!--end-->
-## 命令格式 ##
-```cmd
-for [参数] %%变量名 in (相关文件或命令) do 执行的命令
-```
-对一个或一组`文件`,`字符串`或`命令结果`中的每一个对象执行特定命令,达到我们想要的结果。
-**注意**:
-- 在`批处理文件`中使用 `for` 命令时,指定变量请使用 `%%variable`,而不要用 `%variable`,而在cmd窗口中直接输入的for命令则使用`%variable`的形式。
-- 变量名称是区分大小写的,所以 `%i` 不同于 `%I`.
-
-for命令可以带参数或不带参数,带参数时支持以下参数:`/d`,`/l`,`/r`,`/f`.
-### 无参数 ###
-......省略
-```
-D:\学习9\书籍\批处理>for_f4.bat
-\\DESKTOP-8ISAT6B 的用户帐户
--------------------------------------------------------------------------------
+----------------------------------------------------------------------------
Administrator DefaultAccount Guest
lan WDAGUtilityAccount
命令成功完成。

可以看到就是倒数第二久远版本(4a7e71d88e)中,我的文章内容被删除掉了.所以我只要将该文件恢复到最久远版本(b8abfe5249)就可以恢复丢失的文章内容.

取出指定版本的文件

1
git checkout commitId 文件路径

现在取出最久远版本的文件’批处理 for命令.md’:

1
git checkout b8abfe5249 '批处理 for命令.md'

然后查看该文件内容:

1
cat '批处理 for命令.md'

如果需要修改,那就修改,确认无误后再:

1
2
git add .
git commit -m '恢复文件到xxxx版本'

添加到版本库中即可.