Git技能GitHub flow 与 Git 项目开发流程详解

Posted 毛_三月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git技能GitHub flow 与 Git 项目开发流程详解相关的知识,希望对你有一定的参考价值。

一、简介

       我们常常会将自己的代码托管至一些代码管理平台进行托管,比如GithubGitee、或是自己搭建的托管平台等,其中Git就是重要的传输控制工具。在一开始学习git的时候可能大多数小伙伴并没有合作分支相关的概念,只是熟悉git最基本的pullcommitpush。如下图:


       Remote是远程仓库,Repository是本地仓库,workspace是自己项目的工作区间,这些基本的概念和基本操作就不多详细解释了,接下来进入重点,我们要加入分支管理合并的概念。
       本次示例使用的托管平台为自行部署的平台——Gitlab,全程使用命令方式,不推荐使用任何有关git的GUI工具(tortoise)或是编辑器(idea等)里的git集成工具。

二、GitHub flow

       我们在工作中推荐使用GitHub flow 协作方式,即不在主仓库的分支上开发,而是 fork 到自己 workspace 下。每次开发,需要先checkout 一个新的分支,commit 之后推送到自己的仓库,再向主仓库提Merge Request。所以开发过程中对于大多数项目来说,都会经过如下步骤:

  1. Fork(Once)
  2. Create a branch
  3. Add commits
  4. Open a Merge Request
  5. Code review
  6. Merge
  7. Deploy

三、流程详解

(0)添加SSH公钥

       为了代码和仓库的安全,我们通常使用ssh方式对代码仓库进行操作,这个操作比较简单,而且网上给出的方法很多,网友们可自行参考。

(1)Fork

       一般由项目组长建立代码的主仓库,剩余小组开发人员首先要对其仓库进行Fork,就是从主仓库将项目复制一份到自己的仓库,这个仓库只第一次需要操作。之后再进行clone处理,不要每次看见仓库就直接clone。
                            

(2)Clone

       将项目组长建立的主仓库Fork之后,从自己的仓库进行clone,一般来说一个仓库会有两个分支,一个develop/dev,另一个是master,我们一般都在develop分支上进行开发,所以fork之后选择develop分支,再选择ssh的方式进行克隆:
                            
       在你自己的电脑上,选择好你的Workspace工作区间(项目目录),右键Git Bash here打开git命令窗口(前提是你安装过git)。输入:

git clone ssh://你的地址

       该操作一般也只执行一次。

(3)添加远程仓库

       在我们把项目clone下来之后,我们在项目的根目录再次打开git bash,首先第一行显示的是一些基本信息:

DELL@DESKTOP-24CUUK5 MINGW64 /d/project/xxx_api (check)

       一般常常关注的是最后括号内的单词,代表当前的分支。(之后详细说明分支)
       首先我们需要把远程主仓库给添加进来,方便以后push和pull,我们先输入git remote -v查看现有的仓库

$ git remote -v
origin  ssh://git@gitlab.xxx.cn:8022/aaa/xxx.git (fetch)
origin  ssh://git@gitlab.xxx.cn:8022/aaa/xxx.git (push)

       项目刚拉下来的时候一般只有两个两个远程仓库的地址,一个用来fetch,一个用来push,并且这两个一般都一样,都是自己的远程源仓库origin,我们需要做的就是将项目组长所建立的主仓库添加进来:(upstream是远程仓库的代称,可随意名命)

$ git remote add upstream ssh://主仓库地址

$ git remote -v
origin  ssh://git@gitlab.xxx.cn:8022/aaa/xxx.git (fetch)   #自己的
origin  ssh://git@gitlab.xxx.cn:8022/aaa/xxx.git (push)    #自己的
upstream        ssh://git@gitlab.xxx.cn:8022/aaa/xxx.git (fetch)    #项目组长的
upstream        ssh://git@gitlab.xxx.cn:8022/aaa/xxx.git (push)     #项目组长的

       我们可以看到成功将主仓库的地址,之后可以直接通过一下的方式push和pull代码:(切记不要直接push主仓库,原因后面会说,一般来说你也没有权限,记着push自己的仓库origin

git push origin HEAD:分支
git pull upstream develop

(4)查看分支和状态

       从第四步向后的所有操作,就是你每天都要重复的步骤了。
       我们可以通过输入git branch查看当前工作区间存在的分支:(如下我只有develop一个分支,*代表当前所在的分支,一般情况下刚clone下来就一个develop分支)

$ git branch
* develop

       或是通过 git branch -a 查看本地和远程的全部分支:(remotes的为你的远程仓库origin下的分支)

$ git branch -a
* develop
  remotes/origin/HEAD -> origin/develop
  remotes/origin/develop
  remotes/origin/master

       我们也可以通过输入git status来查看当前分支和分支状态:

$ git status
On branch develop
Your branch is up to date with 'origin/develop'.

nothing to commit, working tree clean

       这个也会显示咱们所处的分支,已经该分支状态,目前就是告诉咱们分支已经是最新的了,没有什么要提交的。以上几个基础命令都是用的比较多的,要熟练掌握。

(5)新建分支

       当我要开始工作了,也就是要开始动工敲代码了,我们先不要一股脑的在develop分支上直接开敲,先打开git bash ,先pull一下主仓库保证代码最新,之后先新建一个分支git checkout -b 分支名称:

$ git checkout -b check
Switched to a new branch 'check'

$ git branch
* check
  develop

       可以看到我们成功新建了一个check分支并切换到了该分支上面,接下来你就可以进行你的代码工作了。你也可以通过git checkout develop再切换到develop分支上面:

$ git checkout develop
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.

(6)stash

       当你开发完功能之后,或者这一天结束了,想要提交代码了,这个时候你要明白一件事,你们是合作开发,主仓库的更新速度是要比你的快的,也就是说很多情况主仓库的代码都是要比你的新,所以你要先pull 主仓库的代码。但是直接pull代码可能会直接带来冲突,所以在此之前你需要提交或者将代码放入暂存区stash,这里我推荐放到暂存区里面保管:

git stash save "save message"

       将代码放入暂存区之后,直接

git pull upstream develop

       这样是不会产生冲突的,这时我们将暂存区的内容拿出来(暂存区是一个栈,后放入的内容排在前面):

git stash list   #查看stash了哪些存储
git stash show   #显示做了哪些改动
git stash apply  #将某个暂存取出,git stash apply stash@$num
git stash drop stash@$num  #丢弃stash@$num存储,从列表中删除这个存储
git stash clear #删除所有缓存的stash

       一般使用pop:git stash pop = git stash apply stash@0 + git stash drop stash@0
       从暂存区取出后,根据个人情况再解决冲突,这里就不详细说明。

(7)commmit & push

       接下来要将代码提交至本地仓库,首先要查看代码的状态

git diff #可以查看这次修改了什么,那些妥当,那些不妥当

       在查看了状态之后,自行选择需要提交的文件:

git add .  #这里的点是全部修改内容,或者自行选中单个文件

       这里的add通俗易懂就是选中的意思,选中你要commit的内容。之后执行:

git commit -m "feat:add UserManagement"

       Commit Message 每次提交,commit message 应该清晰明了,说明本次提交的改动和目的,禁止使用无意义的乱码或单个词语。示例:

  • feat:新功能(feature)
  • fix:修补bug
  • docs:文档(documentation)
  • Style: 格式(不影响代码运行的变动)
  • Refactor:重构(即不是新增功能,也不是修改bug的代码变动)
  • Test:增加测试
  • Chore:构建过程或辅助工具的变动
           禁止使用 git push -f 。还要根据自己的项目内容合理配置好**.gitignore**文件(忽略上传某些文件),这个大家可以再去查阅相关资料。
           commit完成之后就可以push到自己的远程仓库了,
git push origin HEAD:分支名称

       这里的HEAD指当前分支,冒号后面指要push的分支,如果远程仓库没有,会自动在远程仓库创建该分支。(虽然HEAD:分支名称可以省掉,用默认的,但还是建议加上)

(8)提PR

       我们到自己的远程仓库里,向主仓库提交分支合并请求,一般是自己这次工作创建的分支合并到主仓库的develop分支。以gitlab为例:

       左边的是自己的仓库以及分支,右边是目标仓库和目标分支,一般就是主仓库和develop分支。

       选择好分支后,可以描述这次的合并请求,加titledescription,在合并选项里可以选择在和并请求同意后删除这个分支,这个看个人情况,选或是不选,一般自己新建的工作分支可以选择勾上。之后就可以submit提交了,等待项目负责人的回应。这里也可以选择右上角的Assign——>Edit,来选择管理人员,效果相当于“@提醒一下”。

(9)Code Review

       之后就是在项目负责人那边查看这个合并请求,进行Code Review,主要是:

  • 发现错误:人都会不可避免的出现一些纰漏,而这些纰漏在另一个人眼中也许显而易见。
  • 健壮性检查:代码是否健壮,是否有潜在安全、性能风险。代码是否可以回滚。
  • 质量保证:在一般情况下,新提交的代码一定需要写测试,测试不只可以保证你的提交符合预期,还可以在后人改你的代码时多一层保障。
  • 统一风格:对于整个团队来说,代码风格的统一很重要。
  • 完善注释:包括 commit message、代码中复杂实现是否有解释性的注释、紧急 hack 是否明确标注等。
  • 互相学习
  • 哪些人需要参与 Review
    1. 项目的维护者_Tech leader_Mentor
    2. 上下游影响的相关人员

       Reviewer人员还可以对相关的代码做评论,点赞等等,再所有人觉得代码没有问题之后,便可以接收这次合并请求,你的分支就合并到了主仓库的主分支上,你的代码就算是加上去了。
       当然,主仓库管理人也可以对你的合并请求提出问题,做出相关评论,暂时不合并你的分支,甚至取消这个请求,这时你就需要查看评论和问题,修改代码,再次push你自己的这个分支,另一边也能及时看到变化。如果你的合并请求被取消了,只能重新再提交请求。

(10)END

       在分支合并请求通过后,你这次的任务就算是完成了,你可以将本地的刚新建的工作分支合并到develop分支上,再删除该分支,例如这次工作新建的分支为check:

git checkout develop #切换到develop分支
git merge check # 将check分支合并到当前分支
git branch -d check #删除check分支

       或者你也可以直接删除chek分支,pull主仓库来更新代码,也别忘了同步更新你自己的仓库。
       以上10步就是这次使用流程的全部内容,4~10步会是你每天都要重复的工作,下面放一张整体流程图:              

(11)注意事项

  • 在每次新建分支之前和push之前,都要pull一下主仓库,保证代码最新,避免产生冲突。
  • 任何关于项目的私密信息,例如一些账号密码等,不要放到开源平台上!也不要随意把项目源码在未经负责人的同意下私自开源。
  • 在每次提交了合并请求之后不要立马删除该分支,并且写新的代码之前也要再新建一个分支,因为分支合并请求提交之后需要时间,如果合并请求不通过还要在该分支上进行修改。
  • 如果有项目伙伴因需求更改了项目文件名称或是一些文件夹的名称,需要告知所有在工作中的伙伴停下手中的工作,等待文件名称修改后,push到仓库后,其他伙伴再拉新的代码,再进行工作。

       这里推荐git的学习地址:Git教程 - 廖雪峰的官方网站

以上是关于Git技能GitHub flow 与 Git 项目开发流程详解的主要内容,如果未能解决你的问题,请参考以下文章

git-flow 与 github-flow 的优缺点是啥? [关闭]

大数据攻城狮之进阶技能-使用Git上传自己的项目至GitHub仓库

从一个前端项目实践 Git flow 的流程与参考

Git与Github学习版本控制和分支管理

Git与Github学习版本控制和分支管理

Git与Github学习版本控制和分支管理