使用git作为代码版本管理,早已是现在开发者必备的技能,但是大多数的开发者还是只会最基本的保存,拉去,推送,遇到一些commit管理的问题就束手无策,或者用一些不优雅的方式解决。
下面分享一些在开发工作中实践过的实用命令,这些都能够大大提交工作效率,还能解决不少疑难场景。
revert
描述:
给定一个或多个现有提交,恢复相关提交引入的更改,并记录一些这些更改的新提交,这就要求你的工作树是干净的(没有来自头部的修改)。
将现有的提交还原,恢复提交的内容,并生成一条还原记录。
应用场景:
应用场景:有一天测试突然跟你说,你开发上线的功能有问题,需要马上撤回,否则会影响到系统使用,这时可能会想到用reset回退,可是你看了看分支上最新的提交还要其它同事的代码,用reset会把这部分代码也撤回了,由于情况紧急,又想不到好方法,还是人性的使用reset,然后再让同事把他的代码合一遍(同事听到想打人),于是你的技术形象在同事眼里一落千丈。
命令使用:
revert普通提交
学会revert之后,立马就可以拯救这种尴尬的情况
现在master记录如下:
revert掉自己提交的commit.
因为revert会生成一条新的提交记录,这时会让你编辑提交信息,编辑完后:wq保存退出就好了。
再来看下最新的log,生成一条revert记录,虽然自己之前的提交记录还会保留着,但你修改的代码已经被撤回了。
revert合并提交
在git的commit记录里,还有一种类型是合并提交,想要revert合并提交,使用上会有些不一样。
现在的master分支里多了条合并提交。
使用刚刚同样的revert方法,会发现命令行报错了。
为什么会这样,在官方文档中有接受:
通常无法revert合并,因为您不知道合并的哪一侧应被视为主线,此选项指定的父编号(从1开始),并允许revert反转相对于指定父编号的更改
我的理解是因为合并提交是两条分支的交集节点,而git不知道需要撤销的哪一条分支,需要添加参数-m指定主线分支,保留主线分支的代码,另一条则被撤销。
revert合并提交后,再次合并分支会失效
还是上面的场景,在master分支revert合并提交后,然后切到v2.0分支修复好bug,再合并到master分支时,会发现之前被revert的修改内容没有重新合并进来。
因为使用revert后,v2.0分支的commit还是会保留再master分支的记录中,当你再次合并进去时,git判断有相同的commitHash,就忽略了相关的commit需改内容。
现在master的记录是这样的
再次使用revert,之前被revert的修改内容就又回来了。
reflog
描述:
此命令管理重录中记录的信息
如果说reset –soft时后悔药,那reflog就是强力后悔药,它记录了所有的commit操作记录,便于错误操作后找回记录。
应用场景:
应用场景:某天你眼花,发现自己在其它人分支提交了代码还推到远程分支,这时因为分支只有你的最新提交,就想着使用reset –hard,结果紧张不小心点错了commitHash,reset过头,把同事的commit搞没了。
没办法,reset –hard是强制回退的,找不到commitHash,只能让同事从本地分支再推一次(同事瞬间拳头就硬了,怎么又是你),于是,你的技术形象又一落千丈。
命令使用:
分支记录如上,想要reset到b
误操作reset过头,b没了,最新的只剩下a
这时用git reflog查看历史记录,把错误提交的那次commitHash记下
再次reset回去,就会发现b回来了。
设置git短命令
对于我这种喜欢桥命令行而不用图形化工具的爱好者来说,设置短命令可以很好的提高效率,下面介绍两种设置短命令的方式。
方式一:
方式二:
打开全局配置文件
写入内容
使用
源码附件已经打包好上传到百度云了,大家自行下载即可~
链接: https://pan.baidu.com/s/14G-bpVthImHD4eosZUNSFA?pwd=yu27
提取码: yu27
百度云链接不稳定,随时可能会失效,大家抓紧保存哈。
如果百度云链接失效了的话,请留言告诉我,我看到后会及时更新~
码云地址:
http://github.crmeb.net/u/defu
Github 地址:
http://github.crmeb.net/u/defu