基于华为云讲解git的配置与工作流的操作流程

因为我们项目团队使用华为云比较多,所以本文的远程仓库主要参考华为云代码托管项目,但是从配置和工作流本身来讲,是不依赖于具体的远程托管仓库的,任何仓库都可以。

1 git基本操作

1.1 git客户端安装

本文主要想讲解本地的配置以及工作流,至于如何安装网上有很多资料。如果没有安装过git,可以参考下面的链接,进行安装。

华为云-Git客户端安装

1.2 git必知概念

屏幕快照 2019-10-02 下午10.44.02.png

如果不熟悉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命令会失败,这里有两种情况

  1. 不保留develop中的commit
  2. 保留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工作流介绍

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 减少冲突的最佳实践

操作步骤

  1. 开发者完成了一天的工作,要在自己的分支(如susu/my-new-feature)上commit代码
  2. checkout到develop分支上,pull一下,把服务器上develop代码拉下来,保证本地的develop是最新的代码
  3. checkout回到susu/my-new-feature分支上,将本地的develop分支merge到susu/my-new-feature(如果本地develop并没有做过任何修改,步骤2和步骤3可以合并为git pull origin develop:develop)
  4. 如果有冲突,则解决本地冲突
  5. add,commit自己的分支上解决的冲突,并将解决的冲突push推送到远程susu/my-new-feature,再提交合并申请到远程develop

后续处理

第二天早上上班时,先checkout到develop分支,pull一下,再回到susu/my-new-feature上,把本地的develop分支merge到susu/my-new-feature

完成以上步骤后再进行开发是个好的习惯,这样下去就可以避免在一个早就已经被其他人修改过的旧develop版本上进行长期无用的开发,等回过头来合并的时候,发现有大量的冲突需要解决,这就很麻烦了。所以不要闷头写一堆东西后再来进行合并,每天都需要进行一些pull和merge操作。

你可能感兴趣的:(基于华为云讲解git的配置与工作流的操作流程)