优秀的程序员Git使用指南,我在工作中是这样使用Git
wptr33 2024-11-05 14:03 21 浏览
1 絮叨
最近因为工作有点忙,加上自己个人生活的一些琐事,突然感觉写文章太难了,不过还是慢慢坚持下来,即使更新频率变慢了。最近的主题还是那个初衷, 记录下自己日常开发工作的一些想法。
2 前言Git
在日常的开发工作中,免不了会使用git进行代码管理,熟练使用git会使我们有更多的时间专注于代码编写,加快整体开发效率。 然而对我而言,git只是工具,一些常规操作已经足够了,有空有兴趣才会去深入研究它。不熟悉git也不要紧,学学就好, 快的话随便看几个命令后自己再实践一下就可以应付日常开发了。
3 常用Git命令
我日常开发有用idea去操作git,当然有些场景也会在idea的Terminal面板去手打命令,当你熟悉了之后,简直是舒服地飞起,会感觉到看似杂乱无章的各个分支里的代码,在你几个命令操作下管理得井然有序。
3.1 克隆项目 git clone
从远程库拉项目到idea: VCS->Checkout from Version Control->Git,贴上URL后点Clone,idea就会帮我们执行git clone命令。
当然,也可以先git clone https://gitee.com/xxx/Test.git到本地后,在把项目导入idea中
3.2 查看分支 git branch
查看当前项目有哪些分支
3.3 检出代码 git checkout
拉取远程分支代码
git checkout -b dev(本地分支名称) origin/dev(远程分支名称)
3.4 创建分支 git checkout -b
有时你想自己创建一条分支可执行 git checkout -b dev(分支名)
相当于2条命令
git branch dev
git checkout dev
切记,一定要在最新master分支上创建新分支
3.5 拉取/提交/推送代码 git pull/git commit/git push
这几个操作真的是最基本了,相信在所有命令中,熟悉这个的人占极大多数,这里我一般都是借助idea操作的。
如果是多人在同一分支开发的话,一般在push之前要先pull最新代码,但谁要能保证你即使pull后在到push这一瞬间,有没有人提交代码呢?
若别人有提交代码,idea会在你push时提示你要不要merge,若没有冲突会自动合并,此时git日志里会有这么一行记录 Merge remote-tracking branch 'origin/dev' into dev git的日志记录也不会是一条完整直线了。若有冲突,需要手动解决。
若你先pull,没冲突当然最好,有冲突你会pull失败,提示本地修改会被覆盖。 这时可以git stash 暂存修改。 暂存成功后 git pull拉取代码。 git unstash将暂存的代码更新到当前分支上。
如果此时有冲突,可手动解决,idea也提供良好的可视化图形,解决冲突变得容易许多。
左边本地代码、右边远程代码、中间合并成功之后的代码
3.6 撤销操作
还没commit就想放弃修改,直接鼠标右键点击文件Revert就好。
commit了之后还没push,想撤回commint前操作。 git reset --hard HEAD~ --hard直接还原到上一版本,不保留修改(慎用) git reset --soft HEAD~ --soft还原到上一版本,保留commit前的修改(常用) git reset --mixed HEAD~ --mixed 与soft不同的是,还原到git add前没暂存的文件 图形化 GIt->Repository->Reset HEAD...
HEAD~上一版本
一般都后悔操作上一步,想回退多步直接指定版本号吧 git reset --hard HEAD commit_id
push之后想回退。 依然可以用上述操作,只不过在下一次push之后,会拿回退前的版本跟当前修改合并,有冲突要解决。
3.7 合并代码 git merge
这里我一般都是图形化操作,将远程代码合并到自己当前的分支上。
merge dev(分支名) into current
4 多人开发合作模式
所谓的开发合作模式,简单来说就是git的分支管理。
每个公司因为业务量不同、服务器数量不同,都有自己的管理规范。
简单点的可能只有主干master、开发分支dev。
复杂点的多了功能分支feature、bug修改分支fixbug,甚至还有测试分支test、预发布分支pre-release。
当然,这些不同场景的叫法和命名都是自己定义的,但你的项目再简单,最好不要简化到只有master和dev分支。
我曾入职一家公司,看到里面的项目只有master和dev,就直接跟当时的开发说你们这样干,不会遇到某某问题吗?没想到 一语中的,所以后面才规范了分支管理规范。
那会有什么问题?
master是线上稳定的代码分支,一般不能直接在上面修改,这时产品来了2个或以上需求,因进度不同不能同时上线, 这时你们共用一个dev,那岂不是把别人未测试过的代码给上了?你可能会说我们公司需求不多,上线一个功能才开发下一功能,那自己私下想写些demo测试优化,还不是要在dev上改?
2个功能需求想一起测试、一起上线,那我都在dev开发?最好还是分开,各自建自己的分支开发,避免其他同事在解决冲突时因不熟悉git把你的代码给干掉了。后面想一起上线时再一起合并即可。
目前自己在用的管理模式,master+多个feature分支,仅此而已:
需求下来,在master上建个功能分支,命名f+时间+功能名,如:f_20200521_coupon(暂且定义A)。
本地开发、服务器上测试都直接部署功能分支的代码。
测试通过即将上线时,checkout本地的master,git pull拉最新代码。
再切换回自己的功能分支A,并merge matser into current,手动解冲突。
如果想连同他人的分支(暂且定义B)一起上线,最好先叫你的伙伴先合master代码,然后重复3、4步,checkout B、切换A、merge B。
在gitlab等私服申请请求合并,merge A into matser,这时绝对不会有冲突产生。
合并到master后删除自己的功能分支。
服务器上部署master上线。
为什么有第3步?其实是为了第4、第6步服务的,得先保证你本地的matser是线上最新的,经过第4步之后去到第6步,因为master是最新且在第4步已解决冲突,到了第6步就绝对不会有冲突。
为什么不直接在第3步后就 merge A into current(master)?为了安全,master一般不能在本地直接操作,是一个受保护的分支。
为什么在第4步merge matser into A后还要在第6步merge A into matser,绕来绕去,在逗我吗?上面已经回答了,master分支一般是有权限(受保护)的,merge A into matser不能在本地操作,只能在gitlab(git私服)上操作,但gitlab上又不能手动解决冲突,所以我们要先在本地merge matser into A并手动解决冲突,再到第6步就可以完美合并。
是不是被我绕晕了......???
另外,遇到线上bug得紧急修复,也能建个功能分支,然后按上述方法操作。
如果只是改的线上的极小功能(文案,简单判断之类的)又想快速上线,而且你还有操作matser的权限,那大可不必按上述方式,直接master上改后提交就行,多爽是吧。
5 建议
【建议1】一定要在最新的master上新建分支,不然后面上线时会上了别人未测试的代码。
【建议2】做好一个功能点就提交代码,避免意外事件导致代码丢失。和别人一起在同一分支开发时,尽早提交可以不用解决冲突, 把这事留给别人哈哈哈。
【建议3】解决冲突时如果不确定会不会处理不当,最好拉上之前写这段代码的同事一起看。
【建议4】上线合并到master后最好开发群通知一下,让其他开发同事尽早拉最新master代码合到自己的分支。
【建议5】跟建议4关联,开发周期较长,应及时将线上最新master合到当前正在开发的分支,避免最后上线前花时间解决大量冲突,同时尽早避免自己依赖的上游业务被修改而引发新的异常发生。
【建议6】不定期的code review。
【建议7】......................
6 总结
本文介绍了自己平时常用的git命令和一些常规操作、分支管理模式、项目上线规范、日常开发的建议等等,偏向基础,太难也写不出,只是记录自己平时的工作和一些想法。
作为一个git的新手,甚至还不知道git是什么,没什么大不了的,现在学学就好。
但如果你同时是一个开发团队的leader,还没有很好的git管理规范的话,那确实得认认真真去学一下了。
作者:悟空GoKu
链接:https://juejin.im/post/5ec7859ae51d45788f0d6cd1
相关推荐
- Linux高性能服务器设计
-
C10K和C10M计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模。1999年,DanKegel提出了著名的C10问题:一台服务器上同时...
- 独立游戏开发者常犯的十大错误
-
...
- 学C了一头雾水该咋办?
-
学C了一头雾水该怎么办?最简单的方法就是你再学一遍呗。俗话说熟能生巧,铁杵也能磨成针。但是一味的为学而学,这个好像没什么卵用。为什么学了还是一头雾水,重点就在这,找出为什么会这个样子?1、概念理解不深...
- C++基础语法梳理:inline 内联函数!虚函数可以是内联函数吗?
-
上节我们分析了C++基础语法的const,static以及this指针,那么这节内容我们来看一下inline内联函数吧!inline内联函数...
- C语言实战小游戏:井字棋(三子棋)大战!文内含有源码
-
井字棋是黑白棋的一种。井字棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、三子旗等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时...
- C++语言到底是不是C语言的超集之一
-
C与C++两个关系亲密的编程语言,它们本质上是两中语言,只是C++语言设计时要求尽可能的兼容C语言特性,因此C语言中99%以上的功能都可以使用C++完成。本文探讨那些存在于C语言中的特性,但是在C++...
- 在C++中,如何避免出现Bug?
-
C++中的主要问题之一是存在大量行为未定义或对程序员来说意外的构造。我们在使用静态分析器检查各种项目时经常会遇到这些问题。但正如我们所知,最佳做法是在编译阶段尽早检测错误。让我们来看看现代C++中的一...
- ESL-通过事件控制FreeSWITCH
-
通过事件提供的最底层控制机制,允许我们有效地利用工具箱,适时选择使用其中的单个工具。FreeSWITCH是一个核心交换与混合矩阵,它周围有几十个模块提供各种功能特性。我们完全控制了所有的即时信息,这些...
- 物理老师教你学C++语言(中篇)
-
一、条件语句与实验判断...
- C语言入门指南
-
当然!以下是关于C语言入门编程的基础介绍和入门建议,希望能帮你顺利起步:C语言入门指南...
- C++选择结构,让程序自动进行决策
-
什么是选择结构?正常的程序都是从上至下顺序执行,这就是顺序结构...
- C++特性使用建议
-
1.引用参数使用引用替代指针且所有不变的引用参数必须加上const。在C语言中,如果函数需要修改变量的值,参数必须为指针,如...
- C++程序员学习Zig指南(中篇)
-
1.复合数据类型结构体与方法的对比C++类:...
- 研一自学C++啃得动吗?
-
研一自学C++啃得动吗?在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C++的资料从专业入门到高级教程」,点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!个人...
- C++关键字介绍
-
下表列出了C++中的常用关键字,这些关键字不能作为变量名或其他标识符名称。1、autoC++11的auto用于表示变量的自动类型推断。即在声明变量的时候,根据变量初始值的类型自动为此变量选择匹配的...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git pull 之后本地代码被覆盖 解决方案
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mysql max (33)
- vba instr (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)