1. 前言

本文利用 GitHub 平台进行一个多人项目开发流程的演练,以加深课上所学内容。

参考文献:五⼤场景玩转 Git,只要这一篇就够了!

2. 初始化项目

2.1 新建远程项目

一个多人项目通常是从远程创建新仓库开始,这里我们在 GitHub 新建一个仓库 git101

新建仓库时我添加了 .gitignore 文件来进行一个初始化提交,不然默认一个空项目后面不好画图演示。.gitignore 文件顾名思义,在里面指定的文件或文件夹都不会被 Git 跟踪,通常用于指定一些只有本地会用到的文件或者保密性高的私人文件。

值得一提的是,由于某个国家某些自身原因,10月1日开始,GitHub 新仓库的默认分支名都由原来的 master 变成了 main ,需要改回来的话要手动设置,这里我懒得设置了,main 就 main 吧。

2.2 clone 项目到本地

通常一个多人项目需要在项目中把所有的成员包含进来,给他们写权限,这样才能推送自己的代码到远程,这里简单起见,就以网页端直接修改文件模拟另一位小伙伴的工作。项目路径有 http 和 ssh 两种,它们的区别是: http 不需要额外配置,但推送代码的时候需要验证身份;ssh 使用秘钥通信,推送时不需要验证,但需要额外配置,因为我配置过 ssh ,就直接用 ssh 路径了:

现在可以开始工作了,首先将项目克隆到本地然后查看一下仓库分支和提交状态:

# 克隆项目
git clone 项目地址
# 查看所有分支
git branch -a
# 查看提交记录
git log --oneline

可以看到添加 .gitignore 时生成的提交记录以及分支状态,注意,有一条 remotes/origin/main 分支,这条分支只用于同步远程仓库相应分支的状态,不可直接在这些分支上进行操作,后面同步远程代码时会展示它的用法,所以目前仓库的分支状态如图所示,一个节点代表一个提交记录,分支和HEAD指针通过虚线指向提交记录:

3. 在本地创建分支完成工作

通常团队中的每个人负责一个模块的开发,不能直接在主分支上做开发,要保持它的整洁,这里我们新建一个 dev 分支,在上面做三次提交:

# 新建并切换到 dev 分支
# 相当于两条命令:git branch dev && git checkout dev
git checkout -b dev # 将所做修改存到暂存区
git add .
# 提交到本地仓库
git commit -m "提交说明,没有空格可不用双引号"

此时分支状态如图:

4. 整理提交记录

工作完成后,就需要将所做修改合并到主分支了,但在合并之前,我们往往需要对开发分支的提交记录进行一些整理以保持提交记录整洁,比如上面的所做的三次提交,或许我们发现 d2 和 d3 所做工作其实干了同一件事,或者 d2 只是随手提交了一个没什么意义的 log,总之由于种种原因,我不想让 d2 出现在最终提交记录里面了,这时候就可以用 rebase 整理一下提交记录:

# 整理 HEAD 向前三个提交
git rebase -i HEAD~3

之后会用 vim 打开一个修改提交记录的文件,里面有删除合并等各种修改说明,这里我们想删除 d2 ,所以将前面的 pick 改成 drop:

保存退出后不出意外是有冲突的,因为 d3 是基于 d2 修改的,现在 d2 没了,就需要解决 d3 产生的冲突,我们可以随时用 git status 查看工作区状态:

这里提示 dev.txt 文件存在冲突,那我们就打开 dev.txt ,修改冲突到 d3 的状态后加入暂存区然后继续剩下的 rebase 工作:

# 继续未完成的 rebase 工作
# 如果想撤销 rebase ,使用 --abort 参数
git rabase --continue

rebase 完成之后还会打开一个 d3 的提交记录文件,因为修改过这条分支上的提交记录,理应在最新的提交记录上做一下说明,这里我就不做修改了:

整理提交记录后就变成了这个样子:

5. 合并工作到主分支

合并到主分支非常容易,只需要切换到主分支然后 merge 即可,但在此之前,我们还有些事要办。

5.1 模拟远程提交

团队项目不只有一个人,在我们完成工作时,有可能其他人已经率先提交了工作,这里在网页端修改 .gitignore 文件来模拟远程提交:



这里我清空了 .gitignore 文件的内容并添加了一行 *.log ,这表示忽略所有以 .log 结尾的文件,最后将这次提交命名为 r1 ,这时候远程仓库的分支状态发生了改变:

5.2 拉取远程分支的更新

当远程存在更新的提交记录时我们一定不能做合并工作,要始终保持主分支和远程仓库一致。

一般在我们对和远程仓库有关联的本地分支做任何修改时都应该先拉取分支状态,这通常只需要 git pull 即可搞定,它相当于 git fetch && git merge origin/main 两条命令,在这里我想演示一下远程分支 origin/master 的作用,所以将两条命令分开执行:

# fetch 的作用:
# 1. 从远程仓库下载本地缺失的提交记录
# 2. 更新远程分支(origin/master)到最新状态(注意,本地分支没动)
git fetch # 合并 origin/master 到 main 分支
git merge origin/master

fetch 后的状态:

merge 后:

5.3 合并开发分支

至此,本地主分支终于和远程同步了,可以放心的合并开发分支了:

# 合并 dev 到 main
git merge dev

可以看到合并时默认会多出来一个合并节点,暂且叫它 m1 吧,合并后的状态:

查看分支状态也可以使用 gitk 命令,只是不怎么好看:

这里还有个问题,合并分支时,如果在分叉后主分支没有更新的提交记录,merge 默认行为是快进式合并,就是直接把 dev 分支上面的提交记录拿过来而不是新建合并节点,这样做无法保留分支开发的历史,通常我们需要加上 --no-ff 参数来取消默认行为,它们的区别见下图:

6. 推送到远程仓库

这下本地功能开发完成,也进行了合并,可以放心的推送到远程仓库啦:

git push

完成后远程仓库分支也进行了更新:

登录 GitHub 查看,dev.txt 也已经出现:

Git多人项目开发流程演练的更多相关文章

  1. Git多人协作工作流程

    前言 之前一直把Git当做个人版本控制的工具使用,现在由于工作需要,需要多人协作维护文档,所以去简单了解了下Git多人协作的工作流程,发现还真的很多讲解的,而且大神也已经讲解得很清楚了,这里就做一个简 ...

  2. K2项目开发流程

    (自己的学习资料) K2项目开发流程: 1.在VS2013中设计流程,并在K2 Workspce中测试流程 首先是新建新建一个k2的Process文件..kprx后缀. 在里面创建所需要的流程.由于我 ...

  3. 覃超:Facebook的项目开发流程和工程师的绩效管理机制

    覃超:Facebook的项目开发流程和工程师的绩效管理机制 http://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=2650992350&am ...

  4. IT项目开发流程

    项目开发流程: 一.需求分析:相关系统分析员向用户初步了解需求,然后用相关的工具软件列出要开发的系统的大功能模块,每个大功能模块有哪些小功能模块,对于有些需求比较明确相关的界面时,在这一步里面可以初步 ...

  5. Python基础之模块:7、项目开发流程和项目需求分析及软件开发目录

    一.项目开发流程 1.项目需求分析 明确项目具体功能: 明确到底要写什么东西,实现什么功能,在这个阶段的具体要询问项目经理和客户的需求 参与人员: 产品经理.架构师.开发经理 技术人员主要职责: 引导 ...

  6. 使用.NET MVC框架项目开发流程(项目开发流程)

    MVC项目开发流程 整理需求,进行需求分析.项目设计. 整理数据项,建数据库做前期准备,并整理字典. 建立所需数据库表和视图和模型. 页面实现其初步功能(跳过逻辑后台代码),只是实现页面之间的跳转以及 ...

  7. 【CC2530入门教程-01】IAR集成开发环境的建立与项目开发流程

    [引言] 本系列教程就有关CC2530单片机应用入门基础的实训案例进行分析,主要包括以下6部分的内容:1.CC2530单片机开发入门.2.通用I/O端口的输入和输出.3.外部中断初步应用.4.定时/计 ...

  8. Django (九) 项目开发流程&项目架构

    项目开发流程&项目架构 1. 软件开发的一般流程 1. 需求分析及确认: 由需求分析工程师与客户确认甚至挖掘需求.输出需求说明文档. ​ 2. 概要设计及详细设计: 开发对需求进行概要设计,包 ...

  9. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-2.中大型公司里面项目开发流程讲解

    笔记 2.中大型公司里面项目开发流程讲解     简介:讲解一个项目如何从零到上线,经历过怎样的步骤和流程                  1.一个中大型项目的开发流程,从需求调研到项目上线    ...

随机推荐

  1. Javascript数组与函数初识

    1 - 数组 1.1 数组的概念 数组可以把一组相关的数据一起存放,并提供方便的访问(获取)方式. 数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素.数组是一种将一组数 ...

  2. JDBC的架构设计

    本文探讨JDBC需要解决的问题及如何解决和设计的,包括: JDBC要解决的问题 数据库事务 JDBC的架构设计 JDBC代码注意点 Spring是如何处理事务 什么是事务的传播特性 Redis事务与数 ...

  3. 【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解

    写在前面 最近,二狗子入职了新公司,新入职的那几天确实有点飘.不过慢慢的,他发现他身边的人各个身怀绝技啊,有Spring源码的贡献者,有Dubbo源码的贡献者,有MyBatis源码的贡献者,还有研究A ...

  4. JAVA集合类简要笔记 - 内部类 包装类 Object类 String类 BigDecimal类 system类

    常用类 内部类 成员内部类.静态内部类.局部内部类.匿名内部类 概念:在一个类的内部再定义一个完整的类 特点: 编译之后可生成独立的字节码文件 内部类可直接访问外部类私有成员,而不破坏封装 可为外部类 ...

  5. android Studio(3.2.1) NDK配置

    1.创建as工程 2. 创建class类 3. 生成头文件 3.1 配置命令工具 添加工具: 配置工具: Program: $JDKPath$\bin\javah.exe Arugments:-d j ...

  6. 程序员你的maven多模块项目如何对外输出为一个构件?

    上图为常见的台式机,程序员,你看了有啥启发? 台式机生产线 我的maven代码工程 xxx 显示器 xxx-web 主机 xxx-app 键盘 xxx-domian 鼠标 xxx-infrastrat ...

  7. cometoj(A-D+F+H)代码

    A #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> ...

  8. 配置Cassandra开机启动(CentOS 7)

    配置环境:centOS 7 1. 编写开机启动脚本[root@cassandra-01 ~]# cd /etc/rc.d/init.d/[root@cassandra-01 init.d]# vi c ...

  9. 关于h5游戏开发,你想了解的一切都在这儿!

    ​2020年,受疫情影响,线下产业红利褪去,线上迎来的新一轮的高峰.众多商家纷纷抓住了转型时机,开启了流量争夺战.H5游戏定制无疑是今年引流的大热门.如何开发一款有趣.有爆点.用户爱买单的好游戏呢? ...

  10. 手写mybatis框架-增加缓存&事务功能

    前言 在学习mybatis源码之余,自己完成了一个简单的ORM框架.已完成基本SQL的执行和对象关系映射.本周在此基础上,又加入了缓存和事务功能.所有代码都没有copy,如果也对此感兴趣,请赏个Sta ...