使用Git进行项目管理

本文档主要根据本人项目开发经验进行编写。包含了使用Git以及公司Gitlab平台进行项目开发、版本管理、代码备份的教程,主要通过示例项目gitlab-usage-demo进行讲解。

这里推荐几个图形化界面管理Git的工具,用起来比命令行方便直观。

  • Vscode:如果你使用Vscode作为开发环境的话,vscode原生集成Git,并提供了丰富的与Git相关的插件,比较常用的几款有GitGraph, GitLens等。Vscode版本控制官方文档
  • GitKraken:这款工具操作比较方便,UI也是我喜欢的风格,对没有太多git使用经验的新手比较友好,学习成本相对较低。尤其喜欢的一点就是它的分支和提交非常清晰。GitKraken官方使用教程

本教程主要使用git命令行工具进行演示。

创建新的项目

在Gitlab上创建项目

​ 登录你的Gitlab账号Gitlab地址,点击New Project按钮创建新的项目。填写项目名称、项目描述,选择项目访问权限。公司的项目一般选择Internal,意为需要登录才能访问项目,公司外部人员没有访问权限。填写完毕后点击Create Project。

git clone http://118.31.44.251:3000/hanbing/gitlab-usage-demo.git
cd gitlab-usage-demo
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

开发新的功能

创建新分支,并完成功能的开发

Git项目创建的时候,默认分支为master分支。在开发的过程中,尽量不要在主分支上直接进行开发,最好创建新的分支,在开发分支上创建新的功能,经过测试后合并入master分支。

创建新的分支

git branch dev   # 创建名为dev的分支
git checkout dev  # 将当前项目切换到该分支

按照项目需求编写项目代码,此处新建一个main.py 文件,添加helloworld代码

vim main.py

添加以下内容

print("Hello world!")

此时查看项目状态

$ git status
位于分支 dev
未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)
    main.py
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

将修改的文件提交

git add .  # 将所有的修改添加
git commit -m "添加了hello world功能"

多次修改可以提交多次内容,直到当前功能开发完成并完成测试。

将当前功能合并到master分支

完成一个功能的开发并测试通过之后,相应的代码就可以合并到master分支当中了

git checkout master  # 切换到master分支
git merge dev  # 合并dev分支的代码

提交到远程仓库

git push origin master

此时,可以在gitlab上查看到我们的提交结果

使用tag标签对重要版本进行标记

当根据项目设计完成所有功能之后,项目就可以进行线上部署了。为了保留线上项目的历史版本,便于回滚到历史上任意一个上线版本,对于每次进行线上部署,需要使用tag进行管理。需要回滚到某个历史版本时,切换到对应的tag就可以了。tag不同于分支,而是相当于一个个里程碑,对每个重要的上线版本进行标记。

创建tag,-a指定标签名,-m是提交信息

git tag -a v1.0 -m "第一个上线版本"

查看某个tag的信息

git show v1.0

需要回滚时,就可以切换到这个tag

git checkout v1.0

将tag提交到远程仓库

git push origin v1.0

对历史版本进行bug修复

我们总是在master分支上开发合并新的功能,对于上线历史版本发现的bug我们需要进行修复,这显然不能再master分支上进行,因为线上版本总是滞后于master分支,我们最好是从我们标记的tag处创建新的分支,进行bug修复,修复完成上线后对修复完成的版本打上新的标签。这里我们在示例项目上进行演示。

此时我们查看项目的当前状态

# hanbing @ shuding1 in ~/MyProject/gitlab-usage-demo on git:master o [11:13:20] C:1
$ git branch       
* master
# hanbing @ shuding1 in ~/MyProject/gitlab-usage-demo on git:master o [11:13:43] 
$ git tag     
 

我们当前有master分支,由于此版本已经上线,我们打上了v1.0标签,表示这是我们上线的第一个版本。由于新的需求,我们需要在master分支上开发2.0版本,为了演示我们在master分支上提交一些新的代码

echo "print("Hello world! My name is hanbing.")" >> main.py
git add main.py
git commit -m "添加了自我介绍的功能"
git push origin master

上线几天后,运维人员发现了v1.0版本的一些bug,提交给开发人员进行修复,此时我们可以从v1.0处创建一个分支,在此分支上进行bug修复。

git checkout v1.0  # 切换到v1.0
git branch fix_bug_v1.0  # 从v1.0处创建分支 
git checkout fix_bug_v1.0  # 切换到创建的分支

在新创建的fix_bug_v1.0处添加代码

echo "print("Fix a bug of v1.0.")" >> main.py
git add main.py
git commit -m "修复了v1.0的一个bug"

此时查看我们的main.py,应该有以下内容

print("Hello world!")
print("Fix a bug of v1.0.")

进行测试上线过后,我们可以在此打上一个新的标签,v1.1

git tag -a v1.1 -m "第一个上线版本(修复了一个bug)"
 git push origin v1.1
 git checkout master # 切换回master分支上

这样我们既可以及时修复bug又不影响新功能在master分支上的开发。

对历史版本的修改合并到master分支

此时我们已经及时修复了线上版本的bug,master分支上可能也会存在相同的bug,我们需要把刚才的修改合并到master中。此时我们可以在master分支上创建新的分支merge_bug_fix,将刚刚的bug修复代码合并,测试后再讲合并后的代码合并到master分支。

git branch merge_bug_fix  # 从v1.0处创建分支 
git checkout merge_bug_fix  # 切换到创建的分支

合并刚刚的bug修复的代码

git merge v1.1            
自动合并 main.py
冲突(内容):合并冲突于 main.py
自动合并失败,修正冲突然后提交修正的结果。

这里会提示合并失败,因为在master分支和v1.1第二行我们添加了不同的代码,这时,main.py文件中会显示冲突的位置,我们选择需要保留的代码。这里我们选择两者都保留

print("Hello world!")
print("Hello world! My name is hanbing.")
=======
print("Fix a bug of v1.0.")
 

修改过后,我们的main.py文件如下

print("Hello world!")
print("Hello world! My name is hanbing.")
print("Fix a bug of v1.0.")

我们将上面的修改提交

git add main.py
git commit -m "将v1版本的bug修复代码合并到了master"

两者合并之后, merge_bug_fix分支便成为了master和V1.1的共同上游分支,这是我们可以切换到master分支,将 merge_bug_fix分支的修改合并

$git checkout master
$git merge  merge_bug_fix   
更新 987e446..4499939
Fast-forward
 main.py | 1 +
 1 file changed, 1 insertion(+)

显示合并成功,至此,我们已将历史版本中需要保留的修改合并到了主分支上面。

选择权限为Developer(具体可以参考Gitlab的说明,可以根据需求给与不同的权限。链接),点击Add to Project即可。Developer权限可以创建、合并、修改分支,建立新的tag。每个开发者可以在本地新建分支,进行自己代码模块的开发,测试通过后合并入master或者其他分支。(合并方法参考上文【对历史版本的修改合并到master分支】)。

Folk项目使用Merge Requests请求合并自己的修改

开发者较少时,可以采用上述的方法进行合作开发。当开发者渐渐增多的时候,多个开发者同时向同一个分支提交或者合并代码,就容易造成混乱。所以此时我们不能给每一个人都加入一个Developer权限。那么此时不同的开发者如何向项目提交自己贡献的代码呢?答案就是本节所要介绍的Folk 和 Merge Request(与Github上的Pull Request相同)。

首先Folk你想要贡献的项目

此时folk出来的项目的所有者便是你自己,你便可以像修改自己的项目一样在此项目上提交你自己修改的代码。比如我看到这个项目的Readme.md 不够完善,我便可以向README.md添加一些项目说明。

# 使用Git管理项目
这是一个Step by step的git教程。

添加并提交后,我们可以在自己的项目页面看到提交结果。

此时项目开发者看到了你的请求,可以直接选择Merge。但是一般情况下我们不会这么做,而是将提交者的代码下载为本地的一个分支,仔细检查测试提交者的代码后,在合并入提交者想要提交的分支。具体步骤如下。点击 Check out branch 按钮,你可以看到提交者的项目地址,此时你可以这样做。

  • 步骤1 下载 merge request 的内容作为一个新的分支
$ git fetch http://118.31.44.251:3000/hanbing2/gitlab-usage-demo.git master
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
展开对象中: 100% (3/3), 完成.
来自 http://118.31.44.251:3000/hanbing2/gitlab-usage-demo
 * branch            master     -> FETCH_HEAD
$ git checkout -b hanbing2/gitlab-usage-demo-master FETCH_HEAD
切换到一个新分支 'hanbing2/gitlab-usage-demo-master'
  • 步骤2 在本地检查他所提交的修改,具体方法参考上文的【对历史版本的修改合并到master分支】
  • 步骤3 合并冲突,提交上传

sh git checkout master git merge hanbing2/gitlab-usage-demo-master git push origin master

这时,Gitlab上回显示合并成功

本节介绍使用Git开发的一些规范

为项目添加.gitignore文件

项目开发过程中可能会生成大量的中间文件,包括代码运行编译的中间文件,资源文件等等。这些文件通常不要添加到git中进行管理,会产生大量的修改记录,干扰我们代码的管理和开发,最好的方法便是在项目中添加.gitignore规则,忽略这些文件,只保留核心的代码以及配置文件。

这个项目有各个变成语言项目的.gitignore 模板,可以参考使用,可以帮助你忽略代码运行过程中产生的中间文件。

使用Git进行项目管理本文档主要根据本人项目开发经验进行编写。包含了使用Git以及公司Gitlab平台进行项目开发、版本管理、代码备份的教程,主要通过示例项目gitlab-usage-demo进行讲解。这里推荐几个图形化界面管理Git的工具,用起来比命令行方便直观。Vscode:如果你使用Vscode作为开发环境的话,vscode原生集成Git,并提供了丰富的与Git相关的插件,比较常用的几款有G... 在脚本的config部分中更改项目。 通过python -m pip install -r requirements.txt安装所有依赖项,并使用python3执行脚本。 如何与venv一起使用 为了保持本地系统的清洁,将所有Python依赖项存储在一个文件夹中可能会有所帮助。 Python提供了一个虚拟环境包,可用于完成此任务。 python3 -m venv migration-env source migration-env/bin/ac
一.相关介绍 Dockerfile:关于Dockerfile的使用说明,我在文章《让.NetCore程序跑在任何有docker的地方》中有说到,这里不在赘述,需要的可以先看下,本文主要介绍Jenkinsfile结合dockerfile配合使用,自动构建.NetCore应用程序。 Jenkinsfile :Jenkinsfile 是 Jenkins 2.x 或更高版本核心特性 Pipeline(流水线) 的脚本,或者说对于Jenkins 流水线的定义被写在一个叫Jenkinsfile的文...
编写代码并将其推送到单独的分支。 为主要开发分支创建合并请求。 Assignee以及说明字段和评论中被提到的那些人将通过电子邮件通知合并请求。如果需要某一位开发人员关注,你可以在描述字段中@该名开发人员。 等到MR被接受或拒绝,并.    当然通过管里用户在后台新建用户或修该用户的时候去掉创建组的复选框。。但针对开发注册或与ldap集成的用户怎么配置成默认就不能创建呢? 解决办法:     在/etc/gitlab/gitlab.rb中         gitlab_rails['gitlab_default_can_create_group'] = fasle     保存,重新gitlab