我们常常会将自己的代码托管至一些代码管理平台进行托管,比如Github、Gitee、或是自己搭建的托管平台等,其中Git就是重要的传输控制工具。在一开始学习git的时候可能大多数小伙伴并没有合作和分支相关的概念,只是熟悉git最基本的pull、commit和push。如下图:
Remote是远程仓库,Repository是本地仓库,workspace是自己项目的工作区间,这些基本的概念和基本操作就不多详细解释了,接下来进入重点,我们要加入分支管理和合并的概念。
本次示例使用的托管平台为自行部署的平台——Gitlab,全程使用命令方式,不推荐使用任何有关git的GUI工具(tortoise)或是编辑器(idea等)里的git集成工具。
我们在工作中推荐使用GitHub flow 协作方式,即不在主仓库的分支上开发,而是 fork 到自己 workspace 下。每次开发,需要先checkout 一个新的分支,commit 之后推送到自己的仓库,再向主仓库提Merge Request。所以开发过程中对于大多数项目来说,都会经过如下步骤:
为了代码和仓库的安全,我们通常使用ssh方式对代码仓库进行操作,这个操作比较简单,而且网上给出的方法很多,网友们可自行参考。
一般由项目组长建立代码的主仓库,剩余小组开发人员首先要对其仓库进行Fork,就是从主仓库将项目复制一份到自己的仓库,这个仓库只第一次需要操作。之后再进行clone处理,不要每次看见仓库就直接clone。
将项目组长建立的主仓库Fork之后,从自己的仓库进行clone,一般来说一个仓库会有两个分支,一个develop/dev,另一个是master,我们一般都在develop分支上进行开发,所以fork之后选择develop分支,再选择ssh的方式进行克隆:
在你自己的电脑上,选择好你的Workspace工作区间(项目目录),右键Git Bash here打开git命令窗口(前提是你安装过git)。输入:
git clone ssh://你的地址
该操作一般也只执行一次。
在我们把项目clone下来之后,我们在项目的根目录再次打开git bash,首先第一行显示的是一些基本信息:
DELL@DESKTOP-24CUUK5 MINGW64 /d/project/xxx_api (check)
一般常常关注的是最后括号内的单词,代表当前的分支。(之后详细说明分支)
首先我们需要把远程主仓库给添加进来,方便以后push和pull,我们先输入git remote -v查看现有的仓库:
$ git remote -v
origin ssh://[email protected]:8022/aaa/xxx.git (fetch)
origin ssh://[email protected]:8022/aaa/xxx.git (push)
项目刚拉下来的时候一般只有两个两个远程仓库的地址,一个用来fetch,一个用来push,并且这两个一般都一样,都是自己的远程源仓库origin,我们需要做的就是将项目组长所建立的主仓库添加进来:(upstream是远程仓库的代称,可随意命名)
$ git remote add upstream ssh://主仓库地址
$ git remote -v
origin ssh://[email protected]:8022/aaa/xxx.git (fetch) #自己的
origin ssh://[email protected]:8022/aaa/xxx.git (push) #自己的
upstream ssh://[email protected]:8022/aaa/xxx.git (fetch) #项目组长的
upstream ssh://[email protected]:8022/aaa/xxx.git (push) #项目组长的
我们可以看到成功将主仓库的地址,之后可以直接通过一下的方式push和pull代码:(切记不要直接push主仓库,原因后面会说,一般来说你也没有权限,记着push自己的仓库origin)
git push origin HEAD:分支
git pull upstream develop
从第四步向后的所有操作,就是你每天都要重复的步骤了。
我们可以通过输入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
这个也会显示咱们所处的分支,已经该分支状态,目前就是告诉咱们分支已经是最新的了,没有什么要提交的。以上几个基础命令都是用的比较多的,要熟练掌握。
当我要开始工作了,也就是要开始动工敲代码了,我们先不要一股脑的在develop分支上直接开敲,先打开git bash ,先pull一下主仓库保证代码最新,之后先新建一个分支,git checkout -b 分支名称:(这里询问实际开发中不会在本地再新建分支,一般直接在develop分支编码)
$ 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'.
当你开发完功能之后,或者这一天结束了,想要提交代码了,这个时候你要明白一件事,你们是合作开发,主仓库的更新速度是要比你的快的,也就是说很多情况主仓库的代码都是要比你的新,所以你要先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})。
从暂存区取出后,根据个人情况再解决冲突,这里就不详细说明。
如何处理冲突:要不使用git小乌龟要不使用gitbash找到差异点,在本地修改。git小乌龟详见博客:
使用小乌龟TortoiseGit快速解决代码冲突问题_qq_34412985的博客-CSDN博客_小乌龟解决冲突
TortoiseGit - 处理冲突_yaoyutian的博客-CSDN博客_tortoisegit解决冲突
接下来要将代码提交至本地仓库,首先要查看代码的状态:
git diff #可以查看这次修改了什么,那些妥当,那些不妥当,按q可以退出
在查看了状态之后,自行选择需要提交的文件:
git add . #这里的点是全部修改内容,或者自行选中单个文件
这里的add通俗易懂就是选中的意思,选中你要commit的内容。之后执行:
git commit -m "feat:add UserManagement"
Commit Message 每次提交,commit message 应该清晰明了,说明本次提交的改动和目的,禁止使用无意义的乱码或单个词语。示例:
禁止使用 git push -f 。还要根据自己的项目内容合理配置好**.gitignore**文件(忽略上传某些文件),这个大家可以再去查阅相关资料。commit完成之后就可以push到自己的远程仓库了。
git push origin HEAD:分支名称
这里的HEAD指当前分支,冒号后面指要push的分支,如果远程仓库没有,会自动在远程仓库创建该分支。(虽然HEAD:分支名称可以省掉,用默认的,但还是建议加上)
最终会明白 PR 的意思是:一个请对方拉取自己的代码的请求。
我们到自己的远程仓库里,向主仓库提交分支合并请求,一般是自己这次工作创建的分支合并到主仓库的develop分支。以gitlab为例:
左边的是自己的仓库以及分支,右边是目标仓库和目标分支,一般就是主仓库和develop分支。
选择好分支后,可以描述这次的合并请求,加title和description,在合并选项里可以选择在和并请求同意后删除这个分支,这个看个人情况,选或是不选,一般自己新建的工作分支可以选择勾上。之后就可以submit提交了,等待项目负责人的回应。这里也可以选择右上角的Assign——>Edit,来选择管理人员,效果相当于“@提醒一下”。
之后就是在项目负责人那边查看这个合并请求,进行Code Review,主要是:
Reviewer人员还可以对相关的代码做评论,点赞等等,再所有人觉得代码没有问题之后,便可以接收这次合并请求,你的分支就合并到了主仓库的主分支上,你的代码就算是加上去了。
当然,主仓库管理人也可以对你的合并请求提出问题,做出相关评论,暂时不合并你的分支,甚至取消这个请求,这时你就需要查看评论和问题,修改代码,再次push你自己的这个分支(提交请求合并的分支),另一边也能及时看到变化(显示两次commit)。如果你的合并请求被取消了,只能重新再提交请求。
在分支合并请求通过后,你这次的任务就算是完成了,你可以将本地的刚新建的工作分支合并到develop分支上,再删除该分支,例如这次工作新建的分支为check:
git checkout develop #切换到develop分支
git merge check # 将check分支合并到当前分支
git branch -d check #删除check分支
或者你也可以直接删除chek分支,pull主仓库来更新代码,也别忘了同步更新你自己的仓库。
以上10步就是这次使用流程的全部内容,4~10步会是你每天都要重复的工作,下面放一张整体流程图:
这里推荐git的学习地址:Git教程 - 廖雪峰的官方网站