还在把GIT当做SVN用?用了这么久的GIT,你知道它也有规范吗?
yuyutoo 2024-11-09 15:29 1 浏览 0 评论
作为版本控制软件,SVN早已被淘汰了,现在越来越多的开发者都已经拥入了GIT的怀抱。
可是,你一直在使用GIT的方式,真的用对了吗?
下面就给大家列出一些常见的错误使用方式和一些规范和技巧,注意事项。
错误做法1:commit之后立即push
有些人还是停留在SVN的落后思想中,还是使用SVN那种陈旧的提交方式,还特地为自己找了一个看似很合理的借口:
“我这样可以避免发生冲突”,“我不想解决冲突”
你这样真的是很让别人头大啊,对于项目管理来说,这种方式虽然能减少自己代码的冲突解决,但是你会给别人造成很多麻烦。
正确使用git,不要落入svn的使用行为模式: commit + push,这是集中式版本控制系统的最常见工作模式:每一个commit都立即push到server上。
这样就失去了分布式版本控制的灵活性:因为只要还没有push,就有足够的灵活性,我们可以对自己的commits进行修改,甚至删除,在git典型的工作模型中,你每天都可能产生10-30个commits,但我们仅仅需要2~3次的push,只要是不紧急的bug-fix或者feature-develop,都不必要频繁的进行push。
错误做法2:不清理提交历史,就直接push
push之前,记得清理你的提交历史,很多原因导致我们的提交历史图谱是混乱的,通常导致图谱混乱的原因有:
- “我需要多个commit来解决一个bug”;
- “我可能在commit时写了错别字,后来又进行更改”;
- “甚至我在某次提交中,纯粹是为了懒惰,不想使用stash,我可能把很多的修改变更进行了一次临时的commit”;
这些场景都会导致一个混乱的提交历史产生,难以阅读,难以理解,难以让他人看懂,这里的他人也可能是你自己,想想两个月后你再回来看自己的提交历史吧?
提交历史是非常有用的,能够追溯代码来源,谁修改了,改了哪里,产生了什么问题,通常用来后续定位代码问题所在,比如当你的某次提交把别人代码搞丢了的时候,就得通过提交历史来查看你到底做错了什么把别人代码弄丢了。
很幸运的是,git给了我们重新清理的机会:
- 重新修改提交记录(比如修改最近的一次提交记录:git commit --amend)
- 把所有提交放回暂存区,重新进行一次提交(squash)
- 重新对提交顺序进行调整
- 删除某个commit
- 合并某些commit
重新整理commit命令见 git rebase -i
奇淫巧技:cherry-pick
这个命令用于将某个指定的提交copy到当前分支。目的是将某个commit在当前分支上重演一遍。
使用方法:
git cherry-pick [commitId]
比如你在自己分支上改了很多功能,其中一个提交修复了一个bug的,但其他提交都是跟功能特性开发相关,但是这是测试分支、或者UAT分支需要紧急修复你改掉的那个BUG,那怎么把你那个提交放到对应分支上,又不会把其他修改带过去呢?这个情况下 cherry-pick 命令非常有用。
对于rebase命令,需要牢记的一个黄金定律
一句话总结: 只要还未push,都可以安全rebase!
学会使用git rebase -i 清理本地commit历史
命令行中在要清理的分支执行:
git rebase -i [baseCommitId]
会以交互式方式对本地提交进行整理,比如修改commit的注释,合并commit,重新对commit排序,删除某个commit等,以保证push后的提交历史清晰易读有用。
一般使用 rebase -i 清理历史时,往往base就是当前分支的remote tracked branch, 例如:
git rebase -i origin/test
由于经常要使用这个命令,因此可以配置一个全局的别名命令 tidy 来代替上述命令:
git config --global alias.tidy "rebase -i @{upstream}"
然后使用命令:
git tidy
就可以执行清理了! git tidy就相当于git rebase -i [origin/branchName]
尽量不要使用默认的pull命令
git pull 命令是 git fetch + git merge 两个命令的组合。
而通常情况下我们希望远程仓库的分支历史信息是线性化的,然而pull自带的merge操作会进行分支合并,融合,使得分支历史产生交叉点,如果一次 git pull 操作是快进(fast-forward)模式的话,并没有什么影响,然而如果是一个三路合并(three-way-merge),将会自动产生一个merge commit,其注释信息就例如 “Merge branch 'test' of git@git.xxx.com:xxx-developer/scmv6.git into test”这样,就产生了一个远程仓库的分支合并到本地仓库分支,产生一个交叉点,但实际上这个交叉的合并是完全没有意义的。
对于上面说的这种问题,我们为了保证远程分支历史的可读性,线性化,我们要避免使用 git pull 默认的merge动作,我们需要显式的指定使用rebase操作:
git pull --rebase
这样就明确要求 git pull 产生三路合并时通过变基(rebase,中文变基,也称衍合)来进行合并。但这需要我们时刻注意 git pull 操作使用rebase而不是merge,但我们往往会忘记,因为是人就会有犯错误的可能,因此我们可以:
- 先fetch,然后进行rebase
- 修改pull默认的合并方式,全局配置:pull.rebase = true 或者branch级别配置:branch.branchName.rebase = true
上面两种方式二选一,如果你已经习惯了使用git pull,改用fetch + rebase不习惯或者觉得太麻烦(是人总想偷懒),那么就用第二种方式。
rebase还有一些注意事项
git rebase 命令使我们在分支提交历史管理上用非常棒的方式来进行合并,切片,清理等操作,但要注意的是rebase会使提交历史变成线性的,我们在使用rebase合并时,不希望产生merge带来的分支交叉,但仍希望保留merge清晰的语义,线性的提交历史让人讨厌。
举个栗子:
比如我们将自己的分支text_xxx通过merge合并到了关联远程仓库分支的本地test分支,然后进行了 git pull --rebase 或 git fetch + git rebase;然后查看test分支历史,发现我们合并test_xxx分支的历史都变成了线性的,看不出test_xxx分支合并的信息了,但我们仍然希望保留这个分支历史信息,我们就要使用 git pull --rebase=preserve 命令来保证合并记录。
仍然觉得命令 git pull --rebase=preserve太长,不容易记住,我们可以通过全局配置来修改rebase的默认行为:
git config --global pull.rebase "preserve"
尽量使git merge 强制使用three-way-merge
我们在合并自己的本地分支到远程分支时,如果是一个fast-forward模式的,在合并后删除我们的本地分支,那么远程分支历史图谱上变看不到我们的分支开发记录,我们希望在删除分支后,仍然保证我们的分支历史是清晰可见的,我们就不能使用 ff 方式进行merge,我们需要显式指定:
git merge --no-ff
eclipse操作merge时,要注意勾选:if a fast-forward, create a merge commit 选项。
或者全局配置默认merge操作以防忘记:
git config --global merge.ff false
专专心心做技术经验分享,一门心思搞科技知识普及。我是大师兄,喜欢我的分享的话,点个关注吧!@小影迷大师兄
相关推荐
- jQuery VS AngularJS 你更钟爱哪个?
-
在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...
- Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0
-
在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...
- 如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例
-
要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...
- 编程技巧:Jquery实时验证,指定长度的「负小数」
-
为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...
- 一篇文章带你用jquery mobile设计颜色拾取器
-
【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...
- 编程技巧:Jquery实时验证,指定长度的「正小数」
-
为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...
- jquery.validate检查数组全部验证
-
问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...
- Vue进阶(幺叁肆):npm查看包版本信息
-
第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...
- layui中使用lay-verify进行条件校验
-
一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...
- jQuery是什么?如何使用? jquery是什么功能组件
-
jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...
- django框架的表单form的理解和用法-9
-
表单呈现...
- jquery对上传文件的检测判断 jquery实现文件上传
-
总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...
- Nodejs之MEAN栈开发(四)-- form验证及图片上传
-
这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...
- 大数据开发基础之JAVA jquery 大数据java实战
-
上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...
- 推荐四个开源的jQuery可视化表单设计器
-
jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)