记得刚工作那会儿,团队里有个老员工每次提交代码都只用最简单的git add和git commit,出了问题就靠手动合并。有一次他不小心把别人的代码覆盖了,花了整整两天才恢复过来。这件事让我意识到,git远不止那几个基础命令那么简单。
用了这么多年git,我踩过不少坑,也总结了一些实用的经验。今天把这些分享出来,希望能帮大家少走些弯路。
分支管理的心得
很多人习惯在master分支上直接开发,改来改去最后发现跟别人的代码冲突得一塌糊涂。我现在的做法是,给每个功能或修复都单独建一个分支。比如要做登录功能,就建一个feature/login,做完了再合并到主分支。
合并的时候要注意,尽量使用--no-ff参数。这样合并后的历史会更清晰,每个功能的提交都是独立的,不会混在一起。哪天要回滚某个功能,也能精准定位。
对于release分支,我一般会在发布前一周从develop分支切出来,主要用于修复bug和准备文档。正式发布后,release分支合并回master和develop,然后就可以删掉了。
rebase的正确打开方式
rebase这个命令争议挺大的,有人觉得它会修改提交历史,不安全。但我觉得,只要用在合适的场景,它能大大简化提交记录。
我经常用rebase来做这些事情:
整理提交信息。有时候赶时间,提交信息写得很随意,比如“fix”、“update”这种。提交完了才后悔,但已经推送了怎么办?用rebase -i可以修改这些提交信息,把敷衍的描述改成真正有意义的内容。
合并多个提交。刚入门的时候可能习惯一个功能就提交一次,结果一个功能拆了十几个小提交,很不好看。用squash可以把相关的提交合并,让提交记录更整洁。
需要注意的是,已经推送的提交最好不要rebase。如果团队其他人已经基于这些提交做了开发,你rebase之后会导致历史不一致。当然,如果确认只有你一个人在用这个分支,那就无所谓了。
Git钩子真的很好用
之前在公司推动大家用Git钩子,很多人觉得麻烦。但用了之后都说香。
我最常用的是pre-commit钩子。在这个脚本里加上代码检查的逻辑,每次提交前自动运行lint。如果代码风格有问题,直接拦住,不让它进入仓库。这比事后发现再一个个改要省事多了。
还有一个有用的是pre-push钩子。在这个环节可以跑一遍单元测试,测试通过了才允许推送。测试没过的代码坚决不能进仓库,这是底线。
客户端钩子可以自己在项目里配置,服务端钩子则需要运维配合。建议在项目规范里写清楚,哪些钩子是强制的,哪些是可选的。
处理紧急bug的技巧
生产环境出了bug要马上修,但当前的代码还在开发中,这时候怎么办?
我的做法是:先从master切一个hotfix分支出来,在这个分支上修复bug。修完之后立刻合并到master和develop,然后发布。develop上那些还没写完的代码继续开发,等完成了再合并。
如果develop分支的代码跟hotfix的修改有冲突怎么办呢?需要手动解决一下。但这个手动解决是在develop分支上进行的,不会影响已经验证过的hotfix代码。
hotfix的提交信息要写清楚改了什么、为什么改、怎么改的。方便以后查问题。
一些好用的别名配置
git的命令太长了,每次敲一大串很浪费时间。我在自己的~/.gitconfig里配了不少别名:
st代替status,co代替checkout,br代替branch,lg代替log。还有一个是last,能看到上一次提交的信息,有时候忘了刚才改了啥,这个命令特别管用。
log的别名我配的比较花哨,能显示分支图,提交历史一目了然。多人协作的时候,这个视图能帮你看清楚每个人在哪个分支上做了什么。
说说.gitignore的问题
经常有人问我,为什么有的文件明明加到.gitignore里了,还是会被git检测到变化?这种情况一般是因为文件已经被git跟踪了。
正确的做法是:先把缓存清掉,git rm --cached xxx,然后再提交。之后git就不会再管这个文件了。
还有一个常见问题是,.gitignore的匹配规则没写对。比如想忽略所有.log文件,写成*.log就行。难点在于某些特殊文件,比如以点开头的,或者路径中带斜杠的。文档里说得很清楚,用之前查一查就行。
submodule和subtree什么时候用
项目里需要引用另一个独立的Git仓库,这时候就要用到submodule或subtree了。
我的建议是,如果那个仓库会频繁更新,用subtree更好。如果仓库比较稳定,很少变动,submodule就可以了。
submodule有个坑,就是克隆的时候要加--recursive,否则子模块是空的。更新子模块也要用submodule update命令,不是普通的pull。
最后
Git是程序员的基本功,但很多人都停留在会用的层面。深入理解它的工作原理,能让你在团队协作中更加游刃有余。
建议大家有空的时候,把官方文档过一遍,很多高级功能可能你之前都不知道还能这么用。
用户评论
发表评论