小白的故事
本故事纯属虚构,如有雷同,^0^那可太巧了
小白正在开心的写代码,刚刚完成了产品小伙伴的一个需求。还是小有成就感的,正准备起来活动活动喝杯水。谁知产品小伙伴有风风火火的跑过来。
“小白,小白,客户还是感觉以前的交互方式用着顺手。让把功能改回去”。产品小伙伴喊道。
听到这个消息,小白满脸的黑线。废了半天劲做出来的功能再改回去。这太坑了吧。
但是没办法,谁叫客户就是上帝呢,改吧。
开始撤销,ctrl z
。。。
what,没法撤销了?编辑器撤销的步骤有限,这可如何是好啊,难道要手动改代码?这也太悲剧了吧。
“对了找大神问一下,看git有没有办法回退”小白灵光一闪想起来老鸟。
老鸟一听到小白喊他“大神”,瞬间心情舒畅跑过来知道小白。
“你是要回退以前的版本吗?”老鸟问道。
“恩恩”小白点头
“回退其实很简单,看我操作,要记住啊”说完,做到小白的坐位上开始了他的神操作。
“首先用git log
看一下你的提交记录”,老鸟说道
1 | $ git log |
“咦,你这里git log居然乱码啊”,老鸟说道
“这是咋回事啊”,小白疑惑
“好办,编码问题解决一下就可以了”。老鸟输入了如下三条命令
1 | git config --global i18n.commitencoding utf-8 |
再次执行git log
果然好了
1 | git log |
“log记录有时候很多,你可以不停的按j
和k
来实现向下或向上查看内容,不行看了,就输入: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“老鸟说道。
小白豁然开朗,原来历史是可以任意切换的,并不是回退了就抹除了。
小结
- 解决乱码
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
查看历史
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]
显示指定文件相关的每一次diffgit log -5 --pretty --oneline
显示过去5次提交历史切换
git reset HEAD^
可以向前撤销一次,多个^
可以撤销多条历史,或者使用git reset HEAD~5
这样可以一次撤销5条历史git reset
可以任意切换到某个历史,使用git reset --hard commitid
即可,commit id不一定要全的,可以只写前几位