目录
git作为开发中常用代码版本控制工具,本文主要列举实际开发工作中使用git进行项目管理的常见场景,开始之前,默认已经配置好了本地git和已经创建了github账号,有gitlab或者gerrit也是可以的,底层都是走的git协议,操作起来大同小异。演示Idea版本为IntelliJ IDEA 2022.1 (Community Edition),不同idea版本在git使用上差异很小。
git、gitlab和github的异同?
git是版本控制系统,gitlab和gitlhub都是基于git实现的在线代码仓库软件。gitlab和github最大的不同时,gitlab的可以自己搭建在自己的服务器上,gitlab是个人版的github。github上的私人仓库是要收钱的,gitlab可以搭建免费的私人仓库。
gitlab和github上都对不同的语言项目都制定了不需要进行版本管理的文件,像Java项目中的“.class”文件就不需要被管理,因为这个文件可以通过编译得到。
git常用的传输协议,本地协议哑协议和智能协议,远程的http/https 和ssh;哑协议传输速度不可见,智能协议传输速度快,智能协议比哑协议传输速度快。
gitlab用户组五种权限:
Guest:可以创建issue、发表评论,不能读写版本库
Reporter:可以克隆代码,不能提交,QA、PM可以赋予这个权限
Developer:可以克隆代码、开发、提交、push,RD可以赋予这个权限
Master:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限
Owner:可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组leader可以赋予这个权限
Gitlab中的组和项目有三种访问权限:
Private:只有授权的用户才可以看到 分配的用户
Internal:只要是登录 gitlab 的用户就可以看到
Public:只要可以访问 gitlab web 页面的人就可以看到
场景1:将新创建项目提交到github托管
respository可以理解为和project同一个东西,新创建空的project中没有respository,当在工程创建第一个文件的时间respository才存在。
(1)首先在本地新创建一个项目git-test,默认不加入idea托管。
(2)初始化git
git init # 初始化git项目,默认项目名字是master
(3)根据自己需要,可以在.idea/.gitignore中添加target,这样就不用应用编译文件加入到代码控制中。
(4)将工程中所有文件使用git进行版本控制
git add . # 将工程中所有文件暂时放入到缓存区中
git commit -m '项目加入到版本控制' # 提交文件到本地仓库
(5)在github上创建一个新的项目(github从01/10/2021,仓库默认名字由master改为main)
(6)将本地分支和远程分支进行关联,并将本地项目推到远程分支
git branch -m main # 将本地master 分支名字修改为main,和要关联的本地分支一致
git remote add origin https://github.com/ChangBinHu/git-test.git # 和远程分支建立关联
git pull --rebase origin main # 远程仓库有README.md,拉取一下
git push -u origin main # 本地分支推到远程分支
note:在git push的时候,需要输入Username和Password,Username是https://github.com/XXXX/git-test.git//路径中的XXXX部分,Password是github中个人token,从2021年8月13日,github将通过个人密码登陆修改为通过个人token登陆,个人token生成方式
1.git --version #查看版本
2.git config --global init.defaultBranch main #git在2.28.0上,重新设置git默认分支为main
新项目使用git管理过程总结:
(1)git --version #查看版本
(2)git config --global init.defaultBranch main #git在2.28.0上,重新设置git默认分支
(3)创建本地工程项目,git init # git初始化
(4)git add . #工程所有文件加入版本控制
(5)git commit -m 'xxxxx提交信息' # 将工程中文件提交到本地git仓库
(6)github个人主页中创建远程仓库
(7)git branch -m main #如果没有执行(1)(2)步,需要将本地master分支名字修改为main
(8)git remote add origin https://github.com/ChangBinHu/git-test.git(修改为自己的远程仓库地址)# 上一步创建的远程仓库建立连接
(9)git pull --rebase origin main #将远程仓库创建时,默认创建的README.md拉取到本地
(10)git push -u origin main #将本地分支推到远程仓库main中
操作结束之后,git log为:
add ,commit和push作用,前两步修改的文件都还在本地,最后的push才会将文件上传到远程服务器。
场景2:修改最近的一次commit的message
当完成一次代码的编写,写完了commit进行了提交,提交之后,经过别人Code Review之后,给出了建议,进行了修改,因为没有大的修改,所以希望继续使用上次commit的内容,不再提交新的commit,换句话说,就是向上次commit中追加内容。当然一次请求中可以包含多次commit,但是只能对最后一次commit进行修改。
例如:新增两个数相除接口,编写完成之后进行提交,Code Reviewer给出建议没有对除数为零进行判断,重修修改自己的代码进行修改,修改上次commit,再次提交。
(1)git pull# 从远程仓库中获取当前分支的最新代码
(2)编写两个数相除的代码
(3)git add . # 添加当前目录下所有内容到暂存区
(4)git commit -m 'ADD:两个数相除'#提交代码到本地仓库
(5)git push # 提交代码到远程仓库
(6)Code Reviwer完成,提出修改意见,根据修改意见进行修改
(7)git add . #将修改内容添加到暂存区
(8)git commit --amend #修改最近一次commit,这个过程中会让进入到commit内容编辑界面,如果不需要修改直接退出(:q)就行
(9) git push # 将本地库内容同步到远程库
每次Commit提交的原则,修改代码应该大小适中,内容可以清晰表达本次修改内容,一次提交内容太多,给Code Reviewer造成困难,粒度太小,会造成Commit的滥用。
场景3:修改任意一次commit的message
获取对应要修改提交id,然后修改对应message
git rebase -i commitId^
将修改message修改,同时将前面的【pick】修改为【reward或者r】
如果commit已经推到了远端,要将修改commit消息同步更新到远端
git push --force
场景4:保存当前分支的现场
如果在开发当前分支过程中,但是还没有形成一个有意义的提交,需要切换到其他分支,为了避免当前修改丢失,可以将现场进行保存
git stash #开发中加入了紧急任务,可以将当前的工作流进行保存,然后处理紧急任务,
git stash pop /git stash apply#都是恢复stash刚才保存的工作流,pop会将stash中的工作流删除,而apply不会删除。
场景5:提交代码解决冲突
在提交代码时,会提示本地分支落后于远程分支,也就是我们常说的代码冲突,发生冲突的原因是本地编辑过程中,有其他开发者修改了远程分支并进行了提交。如果在本地在原来分支上修改了内容,这种情况在push时并不会产生冲突,进行异常冲突的覆盖,git将这种操作认为是对分支的正常修改,本地修改内容会直接覆盖远程分支内容。
解决方式1:提交之前先拉取远程分支,将远程分支和本地分支进行合并。
(1)使用idea 的update Project功能,会从远程分支拉去最新代码,并进行比较,现实冲突内容,按照提示解决冲突进行。
(2)git add .
(3)git commit -'XXXX'
(4)git push
场景6:切换一个新的分支&分支合并
工作中,修复一个bug或者进行新的功能迭代开发,一般需要创建一个新的分支,bug修复完成或者新迭代开发完成之后,再将分支和主分支进行合并。
(1)git checkout -b 'xxx'# xxx是新分支的名字,创建xxx分枝并同时切换到该分支
(2)git push -u origin 'XXX' [git push --set-upstream origin 'XXXX']# 创建并关联远程分支,XXX是要关联远程分支的名字,一般和上一步新创将本地分支名字一致
(3)在当前分支上进行修改
(4)提交本地修改到远程分支(git add . | git commit -m 'xxx'| git push)
(5)git checkout main #切换到主分支
(6)git pull #获取主分支最新代码
(7)git merge 'xxx' # 合并xxx到当前主分支
(8)git push #将合并好的当前主分支推到远程仓库
note:如果合并过程中有冲突,使用intellij 的图形化界面进行合并,此处冲突和提交代码中的冲突定义一致。
存在问题
(1)目前gitHub访问不稳定,在拉取和提交gitHub代码的时候,出现gitHub无法访问(LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443),多重试几次可以解决。