前言
今天来和大家聊聊关于git的使用,我现在还记得毕业刚参加工作的时候,之前根本没在真实的项目使用过git,在进行代码协同开发的时候超级慌张,根本不敢操作,自己只是稍微了解了下git的概念,而自己又不能说自己不会git,当时真的很痛苦,于是在自己的不断试错的过程中,逐渐学会了git的使用,下面我来和大家简单讲讲关于git的一些操作。
为什么用git
从使用上来说,git速度快,因为git在进行clone时会将所有的代码全部拉下来到本地,因此当你切换分支或者执行提交都可以在本地进行,不受限于网络以及文件传输速度,速度是相当快的,因此深受广大开发者爱戴。
git是分布式的,并且很安全,容错率高,如果远程代码托管平台宕机或远程数据被错删,因为你本地仓库有完整的代码和提交记录,不影响你的开发进度,而且可以随时将本地代码推送到远程,恢复远程仓库的内容。
基本概念
我们首先需要了解下图中的四个区域,我们新建一个分支编写代码的时候,这个时候的代码改动都是在workspace(工作区)中的,当我们执行git add 方法时,会将这些改动添加到staging area(暂存区中),当我们执行git commit 方法时会将这些改动代码从暂存区加入到local repository(本地仓库)中,当我们执行git push 命令时,会将local repository代码推送到remote repository(远程仓库)中。
分支开发模式介绍
比如说一个团队开发一个项目,在最开始的时候技术部负责人维护一个商城项目shop-demo ,在master分支下有一些基础的架构,负责人手下有三个技术人员(张三、李四、王五),他们需要分别开发不同的功能,张三需要开发登录注册功能,李四负责开发购物功能,王五负责开发付款功能,这三个功能开发完之后才能形成一个完整的项目,才能上线投入使用,那么这三个人如何进行协同开发呢?
(下面用大白话进行举例子,感觉表述不清楚的可以去看下面那个分支开发模式图)
三个人一开始都从master分支拉取一个自己的分支进行开发,(张三:feature/login、李四:feature/shopping、王五:feature/pay,三个人公用的分支develop/shop_demo),三个人都在自己的分支下进行自己的项目开发,张三的登录接口很好写,很快就写好了,就将自己的分支代码合并到develop/shop_demo中,李四和王五功能开发完后,需要用到登录时的用户名等信息,就在自己的分支上合并张三提交到develop/shop_demo中的代码,进行自己测试,感觉没有问题后就将自己的代码也提交到develop/shop_demo中,等三个人的代码都编写完成并合并到的develop/shop_demo后,就可以在这个分支上进行所有功能模块测试,测试无误后就可以考虑新建发布分支准备发布了,在他们开发的期间,刚好技术部负责人发现了一个bug,就从master分支新建了一个hotfix/shop_demo分支,并修复了bug,当bug修复完了,三个开发人员功能测试也没有问题,就准备将两个代码一起发布了,就新建了一个发布分支release/shop_demo,将所有改动分支(develop/shop_demo、hotfix/shop_demo)都添加到这个分支当中,再次进行测试,测试无误后将该代码合并到master分支中并上线。
分支名称介绍
例子:feature/goods_management、 hotFix/good_management、develop/good_management
结合下图理解更清晰
master分支:线上分支,也就是最稳定的那个分支,新功能开发需要从这个分支检出新分支
hotfix分支:紧急修复分支,线上出现bug,问题比较严重,就从master中checkout一个分支修复bug,修复完之后合并到master分支中
develop:开发分支,想要开发一个项目,从master中checkout出一个分支,再次基础上进行开发,开发分支的周期比较长。
feature:新功能分支,是开发分支上的一个拓展,本来开发一个功能,发现需要扩展,就在开发分支的基础上checkout一个分支,进行功能的扩展。
release:发布分支,功能分支开发完毕后,就需要发布,新建发布分支,合并开发分支代码,测试无误后会合并到master分支中。
分支开发模式图
git常用命令
git 配置
git在实现前需要进行一些参数的配置(用户名、邮箱),这样才能去远程仓库获取数据,这些配置需要git config命令来配置,可选参数–global 指的是否全局配置,加上参数后设置的信息会被全局保存,所有仓库都生效,而不加上这句只对当前仓库有效。
查询配置信息列表: git config --list 可以查看当前仓库的git配置信息列表
添加配置信息:git config --global --add user.name zhangsan
git config --global user.name lisi
删除配置信息:git config -global --unset user.name
配置完之后可以去获取远程仓库代码了
项目的初始化
git init: git init test 会创建一个名称为test的文件夹,可以在此文件夹下克隆项目,这个文件夹就相当于一个本地仓库
下载项目
git clone:一般用于第一次添加项目,其实就是从远程仓库下载一份代码到本地
新建分支(两种方式):
1.git checkout -b <branch_name>
2.git branch <branch_name>
git checkout <branch_name>
切换分支
git checkout <branch_name> 切换到指定分支,如果当前分支有代码没有提交,则不允许切换分支,git checkout -b <分支名> 将当前分支的内容拷贝一份到另一个分支中,比如我们项目开发在主分支master上,这个可以理解为有新的功能需要开发了,你不能还在master分支上开发,因为这涉及到了分支开发模式
删除分支:
注:如果要删除一个分支,请先切换到其他分支,git不允许在当前分支下删除自己的分支。
删除远程分支:git remote remove <branch_name>
删除本地分支:git branch -d <branch_name>
合并代码:
git merge <branch_name>合并其他分支代码,将其他分支的代码合并到当前分支上,注意在合并前首先要将本地文件都进行提交,避免出现代码覆盖的情况。
查看工作区的文件状态
git status:可以查看当前分支的文件改动状态,以及提交情况,很常用的一个命令, 颜色为红色的是查看所有变更的文件(modifed) deleted(灰色) new file(黄色)
提交代码分为三部分
1.添加代码到暂存区
git add:将一些文件纳入git管理,如果文件想要提交,这个文件必须加入到git中
git add . 一次加入改动的所有代码
git add 通配符 如git add *.java *.xml ,将所有以.java .xml结尾的文件加入到暂存区
2.将暂存区代码添加到本地仓库
git commit -m “注释内容(通常是写这次提交的内容)” :将暂存区代码添加到本地仓库
注(git commit -a 跳过暂存区,直接存储到本地仓库)
通过git commit --amend 这个命令可以重新修改注释内容
3.将本地仓库代码推送到远程代码仓库
git pull 拉取(下载)远程代码并合并
git push 推送本地仓库代码到远程
注:在执行git push命令之前需要先执行git pull,防止自己没有获取最新的远程仓库代码
git show 可以看出历史提交记录,并且看出代码改动地方
查看本地/远程的所有分支
git branch 显示本地的所有分支,如果分支特别多,一页可能不能完全展示出来,这时候可以按Home/End来上下翻页 。
git branch -a 显示远端的分支列表,也可以进行翻页
git fetch 从远程获取本地仓库没有的分支,也就是更新本地仓库的分支
不常用命令:
下面这些命令我平时用的不多,所以就大致介绍下,后续有时间会进行详细介绍。
git grep:git grep 可以根据关键字进行追踪 ,如git grep “bankName”,可以显示这个bankName在哪些文件中出现
git merge --abort :退出这次合并,回到合并前的状态,前提合并前保证workspace是空
git rebase 让日志展示不那么乱,是一条直线形式的
git mv 移动和重命名工作区文件
git restore 指定文件不进行提交
git rm 删除工作区文件
git diff 比较文件的不同,即暂存区和工作区的差异。
git reset 版本回退
git log 查看历史提交记录 git log --pretty=oneline 格式化日志显示
git log -p 不仅可以看日志,同时也可以看到具体修改了哪些地方
分支重命名:远程分支 git remote rename <branch_name> <new_branch_name>
与这个分支有关联的分支也将会改变引用
常见的问题及解决方案:
1.不小心执行了git add 命令,我该怎么退回?
2.git stash有什么用?
3.如何保证我的代码是最新的,上传到线上不会与他人的代码冲突。
4.如何实现版本回退?
5.我把我的开发分支合并到了master上,但是发现了有bug,我该怎么撤回,
6.如何从远程拉出一个分支到本地?
常见问题及解决方案可以参考我之前的博客:
https://blog.csdn.net/qq_44553398/article/details/118027530