因为我们项目团队使用华为云比较多,所以本文的远程仓库主要参考华为云代码托管项目,但是从配置和工作流本身来讲,是不依赖于具体的远程托管仓库的,任何仓库都可以。
1 git基本操作
1.1 git客户端安装
本文主要想讲解本地的配置以及工作流,至于如何安装网上有很多资料。如果没有安装过git,可以参考下面的链接,进行安装。
华为云-Git客户端安装
1.2 git必知概念
如果不熟悉git,请务必查资料理清以下概念:
- workspace 工作区
- index(staging area) 暂存区
- repository 本地仓库区
- remote 远程仓库区
简单来说,如上图所示,我们从远程仓库clone下来代码到本地仓库区,任何增添修改会发生在当前的工作区。如果进行了add操作,相当于增/改/删的代码添加到暂存区,然后通过commit命令,修改就会提交到本地仓库区。如果想要将本地修改推送给远程仓库,就要用到push命令。
1.3 常用操作
华为云-git客户端操作
git全局设置
在安装完毕git之后,要对git进行全局的设置,最好采用如下的设置。
git config --global user.name 你的英文名
git config --global user.email 你的邮箱
git config --global push.default simple
git config --global core.quotepath false
git config --global core.autocrlf input
以上5行都是对git进行全局配置
- 第一行和第二行的英文名和邮箱跟 GitHub (或华为云CodeHub)没有关系。可以跟 GitHub/CodeHub 的用户名和邮箱保持一致,也可以不一致。
- 第三行
push.default
是设置push的模式,其实现在最新的git版本默认就是simple模式,如果你对git不熟悉,就不要修改为其他模式了。 - 第四行
core.quotepath false
是让git支持utf-8编码 - 第五行
core.autocrlf input
是和回车换行有关的,Windows使用回车CR和换行LF两个字符来结束一行,而Mac和Linux只使用换行LF一个字符,说起来有点复杂,可以参考这篇文章
设置SSH key
为了避免每次提交代码都要输入账号密码,请将本机生成的ssh公钥复制后,登录华为云代码托管的个人设置中,添加ssh密钥。
具体的操作见下面的链接。
华为云-设置SSH key教程
ssh-keygen -t rsa -C "您的邮箱"
cat ~/.ssh/id_rsa.pub # 得到公钥内容,复制粘贴到华为云指定位置
git常用命令
以下是常用到的git命令,可参考下方链接进行了解。
华为云-git常用命令
git clone ...
git status
git add .
git commit -m "xxx"
git pull
git push
git checkout newbranch
2 Gitflow工作流
动手开发前,请务必熟悉以下流程。
一般情况下我们会将master和develop两个分支设置为保护分支,这意味着开发者无法将本地代码直接push到这两个分支,而需要在华为云代码仓库中请求合并。
2.1 常用操作
第一步,克隆远程仓库到本地,并创建本地develop分支
git clone [email protected]:xxxx.git
git branch develop origin/develop
第二步,基于develop新建自己的分支(从master分支转移到自己的分支)
git checkout -b susu/my-new-feature develop
第三步,在自己的功能上开展本地的工作(在自己的分支上)
git status
git add .
git commit -m "xxx"
第四步,更新develop分支并合并到自己的开发分支(仍然在自己的分支上)
// 把远程仓库的分支pull到本地,再与本地的指定分支合并。
git pull origin develop:develop
// 解决自己分支的冲突,add,commit,然后推送给远程的susu/my-new-feature分支
git push -u origin susu/my-new-feature
不要在本地的develop上修改东西!不要在本地的develop上修改东西!不要在本地的develop上修改东西!如果本地修改过develop分支,那么上面的git git pull origin develop:develop
命令会失败,这里有两种情况
- 不保留develop中的commit
- 保留develop中的commit
第一种情况,直接清理掉本地develop分支,并重新创建一个
git branch -D develop
git branch develop origin/develop
// 确保回到自己的分支
git checkout susu/my-new-feature
git merge develop
// 解决自己分支的冲突,commit
git push -u origin susu/my-new-feature
如果develop上修改不多,可以对add或者commit做撤销处理。但是这种做法稍微有点麻烦,容易出错,不推荐。
如果在develop中git add .了内容,还没有commit
use "git checkout --
..." to discard changes in working directory
如果在develop中commit了(远程develop分支做了保护,不允许直接push)
git reset --hard xxxxxx
第二种情况,需要先将本地develop分支内容merge到自己的分支,然后重新创建一个与远程同步的本地develop分支
git checkout susu/my-new-feature
git merge develop
// 解决自己分支的本地冲突,commit
// 清理掉本地develop分支,重新创建一个与远程相同的,并合并到本地
git branch -D develop
git branch develop origin/develop
// 确保回到自己的分支
git checkout susu/my-new-feature
git merge develop
// 解决自己分支的冲突,commit
git push
第五步,提出向远程develop合并的请求
可以去到华为云中提交合并请求。在GitHub中,这一步我们通常成为PR(Pull Request)
2.2 理论介绍
操作流程是按照下面的gitflow工作流原理来的,所以有必要了解一下整个工作流的原理。
华为云-Gitflow工作流介绍
- master :是用来上线的生产分支
- hotfix :从master拉取的临时修复分支,解决一线紧急bug,bug解决后合并到master并打上新的版本号。这个修改同时需要合并到develop分支
- develop:是从master拉取的开发分支,用于功能集成。包含所有要发布到下一个release的代码
- release:临近既定的发布日,就从develop分支拉取出一个release分支。任何不在当前分支中的新功能都推到下一个发布中。realese分支用于发布,所以从当前时间点后新的功能不能再加到这个分支上,这个分支只做bug修复、文档生成和其他面向发布的任务。当对外发布的工作都完成了,release分支合并到maser分支并分配一个版本号打上tag;另外,这些release分支新做的bug修复要反向合并回到develop分支
- feature:开发者使用的特性分支,父分支是develop,当新功能完成时,合并入develop分支。新功能的提交从来不与master分支交互
3 减少冲突的最佳实践
操作步骤
- 开发者完成了一天的工作,要在自己的分支(如susu/my-new-feature)上commit代码
- checkout到develop分支上,pull一下,把服务器上develop代码拉下来,保证本地的develop是最新的代码
- checkout回到susu/my-new-feature分支上,将本地的develop分支merge到susu/my-new-feature(如果本地develop并没有做过任何修改,步骤2和步骤3可以合并为
git pull origin develop:develop
) - 如果有冲突,则解决本地冲突
- add,commit自己的分支上解决的冲突,并将解决的冲突push推送到远程susu/my-new-feature,再提交合并申请到远程develop
后续处理
第二天早上上班时,先checkout到develop分支,pull一下,再回到susu/my-new-feature上,把本地的develop分支merge到susu/my-new-feature
完成以上步骤后再进行开发是个好的习惯,这样下去就可以避免在一个早就已经被其他人修改过的旧develop版本上进行长期无用的开发,等回过头来合并的时候,发现有大量的冲突需要解决,这就很麻烦了。所以不要闷头写一堆东西后再来进行合并,每天都需要进行一些pull和merge操作。