7.时光倒流

小白的故事

本故事纯属虚构,如有雷同,^0^那可太巧了

小白正在开心的写代码,刚刚完成了产品小伙伴的一个需求。还是小有成就感的,正准备起来活动活动喝杯水。谁知产品小伙伴有风风火火的跑过来。
“小白,小白,客户还是感觉以前的交互方式用着顺手。让把功能改回去”。产品小伙伴喊道。
听到这个消息,小白满脸的黑线。废了半天劲做出来的功能再改回去。这太坑了吧。
但是没办法,谁叫客户就是上帝呢,改吧。
开始撤销,ctrl z。。。
what,没法撤销了?编辑器撤销的步骤有限,这可如何是好啊,难道要手动改代码?这也太悲剧了吧。
“对了找大神问一下,看git有没有办法回退”小白灵光一闪想起来老鸟。

老鸟一听到小白喊他“大神”,瞬间心情舒畅跑过来知道小白。

“你是要回退以前的版本吗?”老鸟问道。
“恩恩”小白点头
“回退其实很简单,看我操作,要记住啊”说完,做到小白的坐位上开始了他的神操作。

“首先用git log看一下你的提交记录”,老鸟说道

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git log

Author: shooke <xingjiehu@163.com>
Date: Sat Mar 14 16:45:03 2020 +0800

<E7><8A><B6><E6><80><81><E4><BF><AE><E6><94><B9><E5><92><8C><E5><AF><B9><E6><AF><94><E6><97><B6><E9><97><B4>

commit 3e14b6822063c7add663cd79756e77818e821819
Author: shooke <xingjiehu@163.com>
Date: Sat Mar 14 00:30:27 2020 +0800

<E5><AE><A1><E6><A0><B8><E7><8A><B6><E6><80><81><E4><BF><AE><E6><94><B9>

“咦,你这里git log居然乱码啊”,老鸟说道
“这是咋回事啊”,小白疑惑
“好办,编码问题解决一下就可以了”。老鸟输入了如下三条命令

1
2
3
4
5
6
git config --global i18n.commitencoding utf-8

git config --global i18n.logoutputencoding utf-8

export LESSCHARSET=utf-8

再次执行git log果然好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
git log
commit 6531ff6013dd490f60bcd646ca01df61a1ecc8b1 (HEAD -> dev, origin/master, origin/dev, origin/HEAD, master)
Author: shooke <xingjiehu@163.com>
Date: Sat Mar 14 16:45:03 2020 +0800

状态修改和对比时间

commit 3e14b6822063c7add663cd79756e77818e821819
Author: shooke <xingjiehu@163.com>
Date: Sat Mar 14 00:30:27 2020 +0800

审核状态修改

...

“log记录有时候很多,你可以不停的按jk来实现向下或向上查看内容,不行看了,就输入:q退出。就跟vim编辑器使用方式一样”老鸟说。

“想要退回到那里,用git reset会退到对应的commit id就可以了。比如会退到审核状态修改。老鸟边说变执行命令

1
git reset --hard 3e14b6822063c

打开编辑器,小白发现,代码真的回到以前了。

“大神,commit id怎么输入了一部分啊,不需要全部输入吗”,小白激动说道

“不需要,只要git能够确定唯一的commit就行了,一般也就输入前几位”,老鸟说。

“每次都要看commit id好麻烦啊,有没有简单的方法?”小白谦虚问道

“当然有啊,可以用HEAD加上^或者~n回退啊”。老鸟说

1
git reset --hard HEAD^

“这样就会回退一条commit,如果退两条,就再加一个^,退几条就加几个^”老鸟说
”那退20条,岂不是20个^,多麻烦啊“,小白说
”孺子可教啊,这要用~n了,可以这样写“,老鸟说

1
git reset --hard HEAD~20

“明白了,谢谢大神”小白说道。
”你刚才要回退到那条commit啊“老鸟问道
”啊,我只需要退一条就行了,咱们刚才退了这么多,怎么办啊“小白说

”这怕啥,你只要知道历史中的commit id,就不用担心,及时你回退了50条,要回到第二条也没问题“老鸟边说变敲下哦了命令

1
git reset --hard 3e14b6822063c7add663cd79756e77818e821819

”你看这不是回到你第二条命令时的状态了吗,只要你记得回退前的commit id,随时可以穿梭到任何commit“老鸟说道。

小白豁然开朗,原来历史是可以任意切换的,并不是回退了就抹除了。

小结

  1. 解决乱码
    git config --global i18n.commitencoding utf-8 该命令表示提交命令的时候使用utf-8编码集提交

git config --global i18n.logoutputencoding utf-8 该命令表示日志输出时使用utf-8编码集显示

export LESSCHARSET=utf-8 设置LESS字符集为utf-8,为了让配置一直有效,可以把这个设置添加到~/.bashrc,然后执行source ~/.bashrc

  1. 查看历史
    git log可以查看历史。但是如果用git reset回退了,是看不到被退回的历史的,如果要保证历史,可以使用git revert,后面会讲这个命令
    git log --stat 显示commit历史,以及每次commit发生变更的文件
    git log -S [keyword] 搜索提交历史,根据关键词
    git log [tag] HEAD --pretty=format:%s 显示某个commit之后的所有变动,每个commit占据一行
    git log [tag] HEAD --grep feature 显示某个commit之后的所有变动,其”提交说明”必须符合搜索条件
    git log --follow [file]git whatchanged [file] 显示某个文件的版本历史,包括文件改名
    git log -p [file] 显示指定文件相关的每一次diff
    git log -5 --pretty --oneline 显示过去5次提交

  2. 历史切换
    git reset HEAD^可以向前撤销一次,多个^可以撤销多条历史,或者使用git reset HEAD~5这样可以一次撤销5条历史
    git reset可以任意切换到某个历史,使用git reset --hard commitid即可,commit id不一定要全的,可以只写前几位