git管理复杂项目代码

背景

我初学前端的时候接触git,那时候只要会add/commit什么的就好了,网上的教程大多都停留在从头到尾一个个介绍git的命令,关于各种用法,特别是多个分支来回交叉冲突的实际处理,很少有这方面的介绍,经过很多次的实践(踩雷?),想分享一点经验,给刚进入前端的同学做过渡用,但毕竟一千个人有一千个使用git的方式,所以不保证对所有人都是有用的?

现在在公司开发维护一个比较大的项目,有公司自己实现的各种npm包、框架代码、各种业务公共代码和业务实现代码,总行数五六十万行,频繁的git提交经常导致代码翻车,经历过多次车祸现场也算有点心得?。我司前端代码库主要有dev/test/release环境分支(分别对应后端三个环境),几个大的项目/特性分支和小百个业务分支,主要的规则就是自己开发的特性分支合并到dev(和后端联调)=>合并到test(提交测试同学测试,改bug)=>合并release(测试同学模拟线上环境测试,准备发布线上),说出来感觉非常清晰简单,实际操作会有各种问题,有天灾(临时改需求,后台改字段),有人祸(提交代码不规范)。

外部的可视化工具

如果不是特别熟悉git,还是先老实选一款git可视化工具吧,推荐SourceTree(安装后需要免费注册,注册要翻墙),之前用过GitHub Desktop,轻量的git工具,不能满足复杂的需求,后来用了SourceTree,随着版本的更新,越来越好用。 有关SourceTree的使用可以写一篇文章,但是如果对git有稍深一点的理解,非常容易上手,节省了记命令的脑容量,节点图也非常直观。刚使用的同学建议多探索一下,很多操作如解决冲突、重置等比命令行要快,绝大部分命令都能用简单的操作代替。如果git仓库分支多而且关系复杂,纯写命令行的git老司机也容易翻车?

本地和远程origin

提交代码之前请三思,如果是使用SourceTree,请不要在提交上点击同时推送到远端(非常重要

这样提交以后,如果发现自己提交有问题还可以选择更正上一次提交。我们公司的远程仓库除管理员无法回退,所以每次提交要非常谨慎,据说很久以前没那么多限制,大家在release/test上也随意resetpush -f,回退的同时把这中间别人提交的代码也干掉了,于是公司就禁止了除管理员以外对远程仓库的修改。理论上说在这三个环境分支release/test/dev上大家不应该直接提交,应该从其他分支改完merge过来,但是毕竟直接提交更方便,有个精度/样式小bug之类的直接改掉,比切到相应业务分支改掉提交,切回环境分支,merge过来更加的快,但是万一提交出错,就比较尴尬,所以还是不能懒。

提取单次提交cherry-pick

cherry-pick这个命令非常强大,也是我习惯SourceTree后唯二在命令行使用的git命令(还有revert merge),它是提取出某个分支的特定的那次提交应用到其他分支上,精准的操作,对其他代码不会造成任何影响。假如有个紧急bug,即将上线,我直接在release上改了,那么事后一定要同步到自己的特性分支和test等其他环境分支,这时候又不想merge过去,就需要用到cherry-pick了,具体使用命令 git cherry-pick xxxxx,(xxxxx可以取简略的那个commitId)

回退revert及回退某次合并

分支多,合并也多,先说合并merge,merge xxx1 into xxx2这个命令中,xxx1是传入分支,xxx2是当前分支,把xxx1分支上的代码合并到xxx2这个分支上,xxx1上新的代码就到了xxx2上了。比如我自己新开发的一个业务分支开发测试都搞得差不多,那我就准备合并到release,很好理解,但是合并完过一段时间被告知不对,不应该上去,产品还有别的想法?,那就revert吧,(由于前面的原因,reset是被禁止的)revert有优点,会只影响那一次提交的的代码,但是缺点是会产生一个新的节点,revert merge又有不同,还拿上面的例子,假如提前合并上了不该上的代码,那只能revert,具体代码git revert xxxxx -m 1 xxxxx还是commitId,1表示当前分支为准,2表示传入分支为准,一般都是1,然后自己的特性分支又改了很多,等到了要上release的时候是没法在直接merge的,因为revert是一个比较新的节点,这样就要再次revert那个revert提交的commit(和第一次commit不一样,是revert的commit),完了再进行merge自己特性分支最新的代码就可以了(来回merge加revert超乱的,下次谁出问题直接打死他?)

分支污染

分支污染这个问题主要是针对多个开发任务并行的情况,比如这个优惠券功能打算下周上,那个价格比对功能下下周上,那么这两个分支千万不能互相合并,或者间接合并,道理很简单,但是任务一多很容易乱,还有,多个特性任务分支可以随时把release合并进来(最好经常合并以保持同步),因为这是最终版本,但是不能合并除release之外的其他分支,特别是test/dev分支,test/dev分支上存在了许多各种横死的/半死的项目,这些千万不能出到其他分支,要不然其他分支上到release就把这些垃圾内容带过去上线。总之,各公司情况不同,但是大致结构差不多,把握好单向的代码流就好。

复杂场景

实际情况可能很复杂,因为我们公司用json来保存用户级的各种配置,tsx对某些大型组件里面字段类型做校验,这些都是自动生成的,有时候只改了一点配置,就生成了一大堆更改,这样的反复多人在不同分支修改以后,一合并冲突的连它妈都不认识了,这个仍是当前项目的痛点,有可能每次合并就要花去单人半天一天的工作量,这样的只能手动修改合并,借助编辑器内部工具,如果后期有时间可能会把node层json配置改为mongoDB,但是本地json配置还没有好办法,欢迎留言区提出方案。

编辑器内部git工具(vscode的gitlens和webstorm)

vscode里面的必装插件gitlens最近进行了更新,合并等功能已经快赶上webstorm了,合并的三栏式布局适合修改一些复杂冲突,左右是当前以及传入的代码,中间是自己的修改,非常的科学,还有很多功能如查看当前这个文件所有的历史更改,与某个分支的某个文件的快速比对等等功能,解决了复杂项目的很多痛点。

提交钩子及绕过

公司对git有很多规范,禁止了push -f,对commit提交的备注信息做了限制,这个是在自己项目的.git/hooks/里面有限制,可以自己修改,我们统一是必须携带JIRA任务号,便于JIRA统计或者提交的是merge信息,但如果想跳过的话(规则就是用来打破的,?),可以在SourceTree提交里设置绕过钩子提交

tag的问题

实际在多人协作项目里使用git,基本没有打过tag,tag的问题就在于如果和分支名字一样,切换/合并分支容易到tag,而且打了错误的不合适的tag,必须远程和所有本地一起删除tag,要不然只要有一个人本地有tag,一push又到了远程,难以去除,一般都是在运维用jenkins部署时打个上线日期tag,便于回退(但是如果jenkins部署打的tag不规范、重名,也会引发前端代码库提交各类问题)。

总结

git这东西说简单也简单,说难有的问题直挠头皮,但是我觉得,最重要的是要养成一个好的提交习惯,提交本地前先三思,提交到远程前再想一遍,避免翻车,对团队代码造成灾难型的后果,影响他人工作。 纯手敲出这么多字,如果感觉有些帮助,那我就很满足了,如果有问题尽管提,共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现一个通用的生产者消费者队列(c语言版本)

背景:笔者之前一直从事嵌入式音视频相关的开发工作,对于音视频的数据的处理,生产者消费者队列必不可少,而如何实现一个高效稳定的生产者消费者队列则十分重要,不过按照笔者从业的经验,所看到的现象&#xf…

美媒:小米新浪达成合作 采取行动对抗腾讯

来自美媒的报道称,两家中国最具发展潜力的科技公司,新浪和小米将会共同合作,结合各自的通信应用程序来共同对抗移动通信的挑战,尤其是拥有2亿用户的强劲对手微信。 来自中国的消息称,这次新浪与小米的合作将会涉及到新…

Linux expr命令、Linux wc命令、Linux let 命令

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符…

【English】六、am,is,are 分别用在什么地方

is:第三人称单数am:第一人称单数are:第二人称单数,第一、二、三人称的复数 用于第一人称, I am ......(我是.......)用于第三人称, He is ......(他是......) 或She is ......(她是......), It is ......(它是.......)用于第二人…

误删了公司数据库,但我还是活下来了

专栏 | 九章算法 网址 | www.jiuzhang.com 上周我与同事们进行了一次关于职业生涯中搞砸了一些事情的简短谈话。这确实会沦为他人笑柄,却更给我们带来了珍贵的教训。重要的是,我们应该分享那些曾经的错误,这样其他人就可以从其中学习。下文是…

改良程序的11技巧

有很多理由都能说明为什么我们应该写出清晰、可读性好的程序。最重要的一点,程序你只写一次,但以后会无数次的阅读。当你第二天回头来看你的代码时,你就要开始阅读它了。当你把代码拿给其他人看时,他必须阅读你的代码。因此&#…

历时四年,给Google提交的Android Framework Bug终于被Fixed了

历时四年,Google终于修复了一个我发现的Android Framework Bug 2014年在做一个Android终端设备开发过程中,发现了一个Android Framework层的Bug,给Google提交了issue和解决方案,和外界传言一致Google一般不太在意个人开发者提交的…

Linux ping命令、Linux kill命令、Linux logname命令、 Linux logout命令

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 Linux ping命令用于检测主机。 执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有…

前端布局神器display:flex

2009年,W3C提出了一种新的方案--Flex布局,可以简便、完整、响应式地实现各种页面布局。目前已得到所有现在浏览器的支持。 flex浏览器支持一、Flex布局是什么? Flex是Flexible Box的缩写,翻译成中文就是“弹性盒子”,用…

bind简单转发实验

2019独角兽企业重金招聘Python工程师标准>>> *主配置文件内容// [rootlocalhost /]# cat /etc/named.conf // // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a local…

数据结构:块状链表

一、概述 有时候我们需要设计这样一种数据结构:它能快速在要求位置插入或者删除一段数据。先考虑两种简单的数据结构:数组和链表。数组的优点是能够在O(1)的时间内找到所要执行操作的位置,但其缺点是无论是插入或删除都要移动之后的所有数据&…

记账本开发小计(四)

今天处理的是记账本小软件中的查询功能,由于账目的要求就是准确性,所以对于记账本程序来说,模糊查询并不适用,所以在这里只能是按照指定的条件来进行查询所以我做的事按照时间进行查询,为了方便进行处理,这…

Linux ps命令、Linux top命令

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 Linux ps命令用于显示当前进程 (process) 的状态。 语法 ps [options] [--help][options] [--help] 参数: ps 的参数非常…

Prime Distance POJ - 2689 线性筛

一个数 $n$ 必有一个不超过 $\sqrt n$ 的质因子。 打表处理出 $1$ 到 $\sqrt n$ 的质因子后去筛掉属于 $L$ 到 $R$ 区间的素数即可。 Code: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const…

给定a和n,计算a+aa+aaa+a...a(n个a)的和(大数据处理)

题目描述&#xff1a;给定a和n&#xff0c;计算aaaaaaa...a(n个a)的和。 输入&#xff1a;测试数据有多组&#xff0c;输入a&#xff0c;n&#xff08;1<a<9,1<n<100&#xff09;。 输出&#xff1a;对于每组输入,请输出结果。 样例输入&#xff1a;1 10 样例输出&…

ssh和rsh的区别、Linux rsh命令

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 ssh 和 rsh的区别主要有: 1 安全级别不同, 主要是ssh的密码等都是加密传输,而且还有密钥认证的机制, rsh明文传输. 而且没有密钥的机制.…

Java并发编程(多线程)中的相关概念

众所周知&#xff0c;在Java的知识体系中&#xff0c;并发编程是非常重要的一环&#xff0c;也是面试中必问的题&#xff0c;一个好的Java程序员是必须对并发编程这块有所了解的。 并发必须知道的概念 在深入学习并发编程之前&#xff0c;我们需要了解几个基本的概念。 同步和异…

4、容器虚拟化网络概述

Docker 网络 Docker 的网络实现其实就是利用了 Linux 上的网络名称空间和虚拟网络设备&#xff08;特别是 veth pair&#xff09;。 Linux 网络命名空间&#xff1a;https://www.jianshu.com/p/369e50201bce Linux虚拟网络设备之veth&#xff1a; https://segmentfault.com/a/1…

Linux whoami命令、Linux su命令、Linux w命令

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Linux whoami命令用于显示自身用户名称。 显示自身的用户名称&#xff0c;本指令相当于执行"id -un"指令。 语法 whoami […

Weekly 10

Algorithm 1.Remove Element What 移除数组中的指定元素,返回处理后的长度sum,并且数组前sum长度的元素为处理后的元素,不用额外数组&#xff0c;O(1)。How 用快慢指针,快指针遍历,遇到不等于指定元素的替换掉慢指针,然后慢指针前进一位即可。Key Codesclass Solution {public …