Git 之免费的后悔药
前言:这世上,有款药有其名而无其药——没错,就是后悔药,我们程序员里有个工具和这款药那是灰常的像,没错,就是 Git。
一、提出问题
项目进行过程中,需求免不了修修改改,我们也就免不了删删改改,这时候问题就出现了。项目初期用的图标/图片或组件,项目中期需求改了,我们自然把这些没用的文件就给删了,结果后期迭代,发现又用到了,图标/图片你不想通过 Git 找,直接找 UI 要倒也可以,但是如果用的是删除的组件文件,就不得不去找了,那么怎么找呢?
嗯,你肯定想,通过 Git 能拿到所有的删除文件就好了,在所有删除文件里面找不就简单了,这么想,你可真是个小机灵鬼。
我们来看看怎么玩。
二、查看所有删除的文件
接下来睁大眼睛,不要眨,见证奇迹的时刻到了:
git log --diff-filter=D --summary
就这一个命令就解决了你的问题,来看下输入这个命令会发生啥:
➜ git-test git:(dev) git log --diff-filter=D --summary
commit 768af80a5da247713ef2c45f7c7284c1677a4304 (HEAD -> dev)
Author: shavahn <shavahn@shavahn.ai>
Date: Mon Mar 29 11:54:30 2021 +0800
feat: rewrite table filter func & add export func
Change-Id: I62572157e94fe9448548b64aef8ce6b5122027c1
delete mode 100644 src/common/FilterItem/index.js
delete mode 100644 src/common/FilterItem/index.less
commit 0c47af2c7d4ed5e0a5729c85d4eb55be60b8f2ac
Author: shavahn <shavahn@shavahn.ai>
Date: Thu Mar 25 18:59:44 2021 +0800
chore: empty data state
Change-Id: Ie223ff59af33202a5e097e1fc127b2bc7ca85a10
delete mode 100644 src/reducers/PlanManage/planManageReducer.js
看到结果是不是贼激动,这这就是我要的结果,哈哈哈哈😂。
OK,假如现在我们找到了要恢复的删除文件 planManageReducer.js(记住commit-id 0c47af2c7d4ed5e0a5729c85d4eb55be60b8f2ac,下面有用)
我们应该怎么恢复它呢。
下面又是见证奇迹的时刻了。
git checkout $commit~1 filename
实战搞起来:
➜ git-test git:(dev) git checkout 0c47af~1 src/reducers/PlanManage/planManageReducer.js
Updated 1 path from 4b8651de
➜ git-test git:(dev) ✗ git status
On branch dev
Your branch is ahead of 'origin/dev' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: src/reducers/PlanManage/planManageReducer.js
现在我们已经恢复了这个文件,是时候解释下这个命令了, git checkout 0c47af ~1
会检出 0c47af 的上一个提交中的文件,然后恢复,为什么是在上一个 commit 恢复呢?这是因为我们是在 0c47af 中删除的文件,所以需要在上一个 commit 才能恢复出文件。
还有点需要注意,此时我们可以直接执行 git commit 而不需要先执行 git add,这是因为:
当有提交版本号时,表示将工作区和暂存区都恢复到版本库指定提交版本的指定文件的状态,此时HEAD 指针不变,此时的状态相当于把工作区的内容修改到指定版本的文件内容后,再把修改的内容添加到暂存区。
三、发散思维
上面我们遇到的是删除文件情景,除此之外我们还可能遇到文件改名、新增文件等,那怎么办呢?我们去查看下 git log --diff-filter 的参数:
--diff-filter=[(A|C|D|M|R|T|U|X|B)…[*]]
Select only files that are Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R), have their type (i.e. regular file, symlink, submodule, …) changed (T), are Unmerged (U), are Unknown (X), or have had their pairing Broken (B). Any combination of the filter characters (including none) can be used. When * (All-or-none) is added to the combination, all paths are selected if there is any file that matches other criteria in the comparison; if there is no file that matches other criteria, nothing is selected.
看完是不是,一切都明朗了。
四、最后
简书里面去年订阅了些简友,不管写不写文章,每次登陆简书去瞄一眼,现在我是特别的厌烦,感觉她们天天活在过去,每天都在悔恨,就那点破事来回的写,顺手取关了一大波。
有没有发现我换头像了,可不止换了一个地方,包括我的 Github 头像也给换了😂。