当前课程知识点:软件工程 > 第6章 敏捷开发与配置管理 > 6.5 配置管理工具Git > 讲课视频
同学们好
这节课我们一起来学习
软件配置管理工具Git的相关内容
我们知道版本控制
对于大中型软件系统的开发
非常的重要
Linux在1991年的时候
被创造出来
吸引了来自世界的很多志愿者
参与它的代码编写
但人多手杂
不可避免地代码的管理
也变得非常的困难
由于种种原因
CVS SVN之类的
集中式版本控制系统没有被采用
商用免费授权给它们用的
也由于一些版权原因
被收回授权了
于是Linux它的作者花了两周时间
自己用C写了个
分布式的版本控制系统
聪明的你一定已经知道了
这就是Git
很快Git已经成为最流行的
分布式版本控制系统之一了
其实Git这个词
在英文里是饭桶的意思
牛人 总有一些自嘲的幽默感
那对于Git来说
最关键最关键的
就是它分布式的特点
这节课我们就将细细体会
如果你喜欢自学的话
也可以打开屏幕上的自学链接
一步一步跟着做 学起来也很快
了解一个新玩意
我们首先要了解一些基本的概念
对于Git来说
它作为版本控制系统
控制单位就是版本库
而它作为分布式的版本控制系统
这就有远端版本库和本地版本库
远端版本库可以认为
是在非本机上的
比如 我们可以放在服务器上
或者放在第三方托管主机上
而本地版本库
就是在你的电脑上的
如果你有很多合作的小伙伴
每个人
都可以有自己的本地版本库
接下来我们主要要解决的问题
就是如何在分布式这个大前提下
做到版本库之间的同步操作
在此之前
我们先了解一下Git的版本库
是如何创建的
以及如何向它提交变更
我们需要使用Git的命令行
它在Unix系列比较新的操作系统
一般都自带了
如果没有
各个操作系统
都有方便的安装途径
假设我们现在已经安装好
Git命令行了
首先 我们要在希望创建版本库的
地方打开命令行
创建一个空的文件夹
进入这个空的文件夹之后
用git init
就可以把这个空的文件夹
变成一个空的版本库
其实说白了 所谓版本库
在你的本机磁盘看来
它就是一个
有着特殊结构的文件夹
假设我们在这个版本库的
文件夹里面前
创建了一个文件
那么我们通过git status
这条命令
它就会列出当前版本库中
尚未提交的文件改动
那这些改动
我们就称为未跟踪的文件
比如我们就会发现
file.txt这个文件
还没有被跟踪
那接着我们就通过
git add file.txt这条命令
那它就可以把这个文件
给标记一下
它就被git版本库获知了
或者说它已经被跟踪了
我们的版本库就知道
这个文件是需要提交的
那接着我们通过
git commit命令带上-m参数
写上一条提交的消息
那这样就会把版本库中
已经被跟踪的所有文件
一同提交到版本库中
那这样就叫做完成了一次提交
这些文件的改动
就都被版本库记录下来了
比如假设我们又创建两个新文件
那继续用git status
就能同样发现这两个文件
尚未被跟踪
然后继续可以用git add命令
加上文件的通配符
来一次性把它们都跟踪
当然我们也可以分为两条
add命令来跟踪
那最后同样可以用git commit
带上提交的消息来完成提交
那这样
我们就已经进行了两次提交了
我们的版本库中
就有了三个新的文件
刚刚说的版本库
是在我们本机创建的
如果同样的方式
在服务器上创建一个git版本库
这就成为了远端版本库
为了更好进行协作
我们经常采用一个远端版本库
以及若干个分布在不同机器上的
本地版本库这样的模式
任何本地版本库有提交
都把提交同步到远端版本库去
这样所有的本地版本库
就可以进行同步
很多时候
我们是先创建好远端版本库的
这样我们就需要把它克隆到本地
通过git clone
带上版本库的地址
就可以完成远端版本库
到本地版本库的克隆
这边版本库的地址
如果在Github上一般是
冒号 用户名/版本库名
这样格式
其实如果你熟悉的话
会发现这其实是一个
ssh格式的URL
当然Git它的兼容性很好
也可以用其它格式的版本库地址
比如说Github
它也提供了https格式的
版本库地址
我们现在已经把远端版本库
在本地的若干台机器上
完成了克隆
那接下来要介绍的是
如何把文件的变动
从远端版本库同步到本地版本库
这种操作叫做从远端版本库
拉取comit到本地
具体地使用命令很简单
就是git pull
比如说我们远端版本库上
最新的提交
它把file4.txt
这个文件进行了变动
那我们在本地版本库
就只需要运行一下git pull
它就会自动地从远端拉取commiit
这样变动的文件就同步到本地了
那对于另一个本地版本库
也是一样的
运行这条命令后
就可以把变动的文件同步到本地
我们刚刚知道了
怎么把变动从远端同步到本地
那远端版本库的变动是怎么来的
我们当然不会在远端版本库上
去改动文件然后提交
其实我们可以在本地版本库
进行文件的变动
然后我们把这些变动
提交到本地版本库去
最后再把本地版本库
同步到远端去就可以了
而我们要把本地版本库
同步到远端
就需要通过git push这条命令
它就会自动地把远端版本库上
还没有的文件变动
从本地同步过去
那这边有一个需要注意的点
就是git push命令
它要求你的本地版本库
已经拥有了远端版本库的
所有commit
所以我们一般会先git pull
然后再进行文件变动
并提交后再git push
我们对file4.txt进行了改动
然后让版本库标记
这个文件的改动是已经跟踪了
那接下来
如果我们想撤销这一改动
可以通过git reset命令来实现
这样它只会把file4.txt的改动
恢复成未跟踪的状态
而它的改动是仍然存在的
而如果我们想彻底
抛弃这个文件改动
让它恢复成上次commit时候的样子
就可以通过git checkout
并指定这个文件
大家在用的时候一定要小心
因为这条命令它会丢失file4
自从上次commit之后的所有改动
比较危险
因为它会丢失你对文件的修改
除非你真的想这么做
否则慎用
我们对一些文件进行了改动
然后想提交的话
可以用git commit带上-a
来自动地把修改的文件先add
再进行commit
带上提交消息的做法
和之前一样就是用-m的参数
这样我们就让版本库中
增加一次新的commit
提交的消息为msg4
接着 我们再把它push到远端之前
突然间灵光一闪
想到有个地方忘了修改了
于是我们打开file4来进行改动
那接着就要把这个改动的标记
为已跟踪
然后我们可以增加一次
新的commit
或者其实
我们也可以直接把它加到
上一次commit去
比如刚刚提交的这个msg4
具体做法就是直接git commit
带上--amend
这样的参数就可以了
这样file4里就要会提交到
上一次的commit去
说了这么多git版本库的操作
其实版本库里面
还有个很重要的概念 就是分支
我们前面也是在同一个分支
去进行文件的变动和提交
一般这个(09:05)的分支
叫做master
我们在远端版本库和本地版本库
都存在这个分支
它们之间可以互相同步
为了部署的需要
我们也常常会在远端版本库
创建一个release分支
保持这个分支
随时都是可部署的状态
这样部署服务器上
始终从这个分支去同步文件
就OK了
除此之外
我们可以通过Git的命令行
很方便地创建新的分支
比如
我们按星期进行开发的迭代
第一周的迭代
可以创建一个week1分支
通过git checkout-b
带上新分支的名称就行了
这样就会创建一个
名为week1的分支
同时当前的工作分支
也自动切换到这个新分支去了
于是 我们在第一周迭代中
新增加的功能
都可以在这个新分支上去开发
而如果在第一周迭代的过程中
发现已经发布的系统
存在致命的bug
就可以很方便地切换回
master分支进行bug的修复
这样就相当于给我们的开发
开了一个支线
当然这个支线开发完成之后
再把它合并回主线就行了
不仅不会影响新功能的开发
也不会耽误现有系统bug的修复
那么我们刚刚创建的week1分支
如果我们在这个分支上
进行一些新的提交
就可以把这个分支
同步到远端版本库去
而如果远端版本库
不存在这个分支
就通过给git push的命令
增加-u的参数就行了
带上origin和新分支的名称
接下来介绍分支的合并操作
举个例子
我们首先切换到week1分支
然后我们进行了文件的改动
并提交
这样file4就在week1分支的
最新提交中被改动了
那我们想把week1分支的
最新的提交合并到master分支去
就要切换到master分支
然后通过git merge
带上另一个分支的名称
就可以把那个分支
合并到当前的工作分支
这样我们刚才在week1分支
对file4的改动
就被合并到master分支去了
合并的时候还有一种特殊的情况
就是可能会出现冲突
比如我们在master的分支上
file4它有一些week1分支上
没有的改动
而且它们的改动出现了冲突
比如说
它们改动了文件的同一个位置
这样在merge之后
git的工具就会提示我们
file4发生了冲突
这样file4它的其中部分内容
就会像屏幕上打出来的这样
它就标明了其中的部分
哪些来自当前的分支
哪些来自week1的分支
我们就需要手工
将它们合并为期望的结果
那完成之后保存
然后通过git add
就可以让版本库知道
这个冲突已经解决了
接着就是
常规的git commit来提交
我们已经对week1这个分支
完成了开发工作
并且已经把它
合并到了主分支去了
那接下来
我们就可以把这个分支删掉
方法很简单
首先要确认当前的工作分支
不是要删除的分支
我们要删除week1
那就要先切换到另一个分支
比如说主分支
然后我们通过git branch-d参数
带上要删除的分支的名称就行了
这样分支在本地就被删除了
我们也可以把删除分支这个操作
同步到远端版本库去
通过git push origin带上--delete
和分支的名称就行了
我们说了这么多的git命令
一时半会可能很难记住
其实git的学习也没有那么麻烦
比如我们可以借助一些
带图形界面的git管理工具的力量
SourceTree就是一款
挺方便好用的免费Git管理软件
它提供了Windows和OS X
两个操作系统的版本
大家如果感兴趣的话
可以自行下载使用
接下来我们来聊一聊
使用Git进行代码托管开发的实践
这边我们介绍一种
git协作开发的方式
在远端版本库上
有master分支作为开发的主分支
还有release分支
作为部署用的分支
在程序员的本地版本库中
有master分支
当他要开发一个新功能的时候
就会在本地的版本库中
创建一个新的分支
比如说feature1
当它完成新功能的开发之后
就会把新的这个分支
合并到主分支去
并把它同步到远端
而对于任意一个
程序员的本地版本库
也是这么做的
这样就可以保证
master分支始终都是可运行
可测试的版本
而不会是某个功能
只完成一半的半成品
具体来说
我们的远端版本库上
有master分支
和一个起始的commit
在两个程序员的本地版本库中
都已经同步了主分支的最新提交
两位程序员进行了分工
要开发不同的功能
他们分别创建了
新功能的本地分支
第一个程序员
他在feature1分支上
进行了一些开发
有了一些提交
而第二个程序员
则在feature2分支上
有了一些提交
接着他们在主分支上发现了bug
于是第二个程序员
切换回主分支去
对bug进行了修复
并立刻同步到了远端版本库去
而第一个程序员
则继续把feature1给完成了
然后这个时候
他会发现主分支有新的提交
所以他首先要从远端
把新的提交拉取到本地
接着他把主分支的最新提交
和featur1的最新提交
合并在主分支上
并把这些提交都同步到远端去
于是 远端就在没有创建
feature1分支的情况下
得到了feature1分支的所有提交
接着feature2分支
也有了一些新的动作
然后第一个程序员
又在主分支上解决了一个bug
他进行了一次新提交
并且推送到了远端
这个时候第二个程序员
已经完成了对feature2的开发
他想把成果合并到主分支去
那他也要先从远端
拉取最新的master分支
然后 再进行合并
最后他再把合并后的结果
同步到远端去
这样
远端就又得到了
feature2的所有提交
当然第一个程序员的本地版本库
也可以从远端
拉取最新的master分支
就这样继续下去
这个版本库
它就可以井井有条地
进行开发工作
而且保证了主分支
始终都是可运行
可测试的版本
如果你想对git的命令
有更详细的了解
可以查阅GitBook
而SoureTree这款软件的官方
也提供了一些关于使用的说明
大家可以去查阅
这节课就到这里 谢谢大家
-1.1 软件无处不在
--讲课视频
-1.2 软件的本质特性
--讲授视频
-1.3 软件工程的产生与发展
--讲授视频
-1.4 软件工程的基本概念
--讲授视频
-1.5 软件质量实现
--讲授视频
-1.6 业界人士谈软件工程
-测验题--作业
-讨论题
--讨论题
-作业题
--第一张 作业题
-2.1 编程过程与规范
--讲课视频
-2.2 良好的编程实践
--讲课视频
-2.3 Python集成开发环境
--讲课视频
-2.4 代码静态检查
--讲课视频
-2.5 代码性能分析
--讲课视频
-2.6 结对编程实践
--讲课视频
-2.7 刘贺谈软件工程
--讲课视频
--讨论
-测验题--作业
-作业题
--第二章 作业题
-3.1 单元测试概述
--讲课视频
-3.2 黑盒测试方法
--黑盒测试方法
-3.3 白盒测试方法
--基本概念
--代码覆盖标准
--基本路径测试
-3.4 单元测试工具
--单元测试工具
--html
-测验题--作业
-作业题
--第三章 作业题
--作业题附件
-4.1 软件过程
--讲课视频
-4.2 软件过程模型
--讲课视频
-4.3 敏捷开发过程
--讲课视频
-4.4 微软公司开发过程
--邹欣经理自我介绍
--微软开发过程之一
--微软开发过程之二
-测验题--作业
-5.1 团队组织与管理
--讲课视频
-5.2 项目沟通管理
--讲课视频
-5.3 软件项目计划
--讲课视频
-5.4 软件项目估算
--讲课视频
-测验题--作业
-讨论题
--讨论
-6.1 敏捷开发之Scrum
-- 敏捷开发之Scrum
--html
-6.2 用户故事与估算
--讲课视频
-6.3 团队协作工具Tower
-6.4 配置管理
--讲课视频
-6.5 配置管理工具Git
--讲课视频
-测验题--作业
-作业题--作业
-7.1 需求工程师
--讲课视频
-7.2 需求定义
--讲课视频
-7.3 需求的类型
--讲课视频
--讲课视频(2)
-7.4 需求工程过程
--讲课视频
-7.5 需求的主要来源
--讲课视频
-7.6 需求获取技术
--讲课视频
--讲课视频二
--讲课视频三
-7.7 撰写需求文档
--讲课视频
-测验题--作业
-讨论题
--讨论
-8.1 用例建模概念
--讲课视频
-8.2 用例建模过程
--讲课视频
-8.3 用例建模精讲
--讲课视频
-8.4 建模工具介绍
--讲课视频
-8.5 微信抢票应用案例
--讲课视频
-测验题--作业
-讨论题
--讨论
-9.1 面向对象分析
--讲课视频
-9.2 CRC卡片分拣法
--讲课视频-1
--讲课视频-2
-9.3 面向对象设计
--讲课视频-1
--讲课视频-2
-9.4 类图建模
--讲课视频-1
--讲课视频-2
-第9章 面向对象分析与设计--测验题
-讨论题
--讨论
-10.1 顺序图概念
--讲课视频
-10.2 顺序图建模
--讲课视频
-10.3 顺序图风格
--讲义视频
-10.4 状态建模
--讲课视频
-10.5 状态图
--讲课视频
-10.6 状态图精讲
--讲义视频
-测验题--作业
-讨论题
--讨论
-11.1 软件体系结构概念
--讲授视频
-11.2 软件设计原则
--讲授视频
-11.3 软件体系结构风格(一)
--讲授视频
-11.4 软件体系结构风格(二)
--讲授视频
-11.5 软件体系结构风格(三)
--讲授视频
-11.6 软件设计过程
--讲授视频
-11.7 Web系统架构设计
--讲授视频
-11.8 数据库选择策略
--讲授视频
-测验题--作业
-作业题
--html
--html
--html
-作业题--作业
-12.1 交互设计概述
--讲授视频
-12.2 交互设计目标
--讲授视频
-12.3 GUI设计原则
--讲课视频
-12.4 KLM效率模型
--Video
-12.5 Fitts定律
--讲授视频
-12.6 交互设计过程
--讲授视频
-测验题--作业
-13.1 软件测试概念
--讲课视频
-13.2 软件测试类型
--讲课视频
-13.3 软件功能测试
--讲课视频
-13.4 软件性能测试
--讲课视频
-测验题--作业
-14.1 软件部署与交付
--讲课视频
-14.2 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)