百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

还在把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到远程仓库的分支上的commits进行rebase
  • 只要你本地仓库分支上的commits还未push到远程分支,都可以安全使用rebase
  • 对于不再有子分支的分支,只要rebase操作后重写的commits还未push到远程分支,可以安全的再次执行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表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...

    取消回复欢迎 发表评论: