文章目录
软件构造过程与配置管理
1 软件配置管理SCM与版本控制系统VCS
1.1 软件配置管理SCM(Software Configuration Management)
- 软件配置管理SCM:追踪和控制软件的变化
- 软件配置项:软件中发生变化的基本单元(例如:文件)
- 基线:软件持续变化过程中的“稳定时刻”(例如:对外发布的版本)
- CMDB:配置管理数据库存储软件的各配置项随时间发生变化的信息+基线
- 版本:为软件的任一特定时刻(Moment)的形态指派一个唯一的编号,作为“身份标识”
1.2 版本控制系统VCS(Version Control System)
-
Local VCS:本地版本控制系统:仓库存储于开发者本地机器无法共享和协作
-
Centralized VCS:集中式版本控制系统:仓库存储于独立的服务器,支持多开发者之间的协作
-
Distributed VCS:分布式版本控制系统:仓库存储于独立的服务器+每个开发者的本地机器
2 Git的结构、工作原理、基本指令
2.1 Git的结构
2.1.1 仓库结构
-
.git仓库
.git directory
(配置管理数据库,存储软件的各配置项随时间发生变化的信息和基线) -
工作目录
Working directory
:本地文件系统 -
暂存区
Staging area
:用来隔离工作目录和git仓库
2.1.2 文件状态
- 已修改:刚在工作区
Working directory
改完,还没有放到暂存区 - 已暂存:将在工作区改完的版本add到暂存区
Staging area
- 已提交:将在暂存区的版本commit到.git仓库
.git directory
,此时工作目录的版本与git仓库的版本保持一致
2.2 Git的工作原理
2.2.1 分支与合并
- 除初始commit外,每个commit至少有一个父亲
- 多个commit指向同一个父亲:分支
- 一个commit指向两个父亲:合并
2.2.2 文件变化
- 文件未发生变化,则后续多个版本始终指向同一个文件,无需重复存储
- 文件发生变化了,存储两份不同的文件,两个版本指向不同的文件
2.2.3 HEAD的理解
HEAD,它始终指向当前所处分支的最新的提交点commit,但其表示的依然是分支如master或test。你所处的分支变化了,或者产生了新的提交点,HEAD就会跟着改变
2.2.4 分支合并举例
- 创建分支只是给当前的提交点加了个分支名引用
- 只用commit才会增加新的提交点
- 合并时比较两个分支当前的提交点
若主分支提交点是副分支提交点的祖先,则主分支移动到副分支提交点;
若主分支提交点和副分支提交点有共同的祖先,则生成一个新提交点以当前两个提交点为父亲,主分支移动到新提交点
-
git checkout –b iss53 创建分支iss53并切换到iss53,依然在提交点C2
-
git commit 在分支iss53上commit一个新提交点C3,C3在C2后
-
git checkout master 切换到分支master,在提交点C2 git checkout –b hotfix 创建分支hotfix并切换到hotfix,依然在提交点C2 git commit 在分支hotfix上commit一个新提交点C4,C4在C2后
-
git checkout master 切换到分支master,在提交点C2 git merge hotfix 将当前分支master(主分支)与hotfix(副分支)合并,主分支移动到副分支提交点C4
-
git branch –d hotfix 删除分支名hotfix,不影响提交点 git checkout iss53 切换到分支iss53,在提交点C3 git commit 在分支iss53上commit一个新提交点C5,C5在C3后
-
git checkout master 切换到分支master,在提交点C4 git merge iss53 将当前分支master(主分支)与iss53(副分支)合并,生成一个新提交点C6以当前两个提交点为父亲,主分支移动到新提交点C6
2.3 Git的基本指令
-
add
git add . 添加当前目录的所有文件到暂存区 git add [dir] 添加指定目录到暂存区,包括子目录 git add [file] 添加指定文件到暂存区
-
commit
git commit -m [message] 交暂存区到本地仓库,message代表说明信息 git commit [file] -m [message] 提交暂存区的指定文件到本地仓库 git commit --amend -m [message] 用一次新的commit,替代上一次提交 git commit -a 跳过git add步骤,直接将所有修改过的文件暂存起来并提交
-
branch、checkout、merge
git branch 列出所有本地分支 git branch -r 列出所有远程分支 git branch -a 列出所有本地分支和远程分支 git branch [branch-name] 新建一个分支,但依然停留在当前分支 git checkout -b [branch-name] 新建一个分支,并切换到该分支 git checkout [branch-name] 切换到指定分支,并更新工作区 git branch -d [branch-name] 删除分支 git branch --track [branch] [remote-branch] 新建一个分支,与指定的远程分支建立追踪关系 git merge [branch] 合并指定分支到当前分支
-
diff
git diff 显示工作区和暂存区的差异 git diff HEAD 显示工作区与当前分支最新commit之间的差异
-
rm
git rm [file] 与版本一致未修改的文件,删除工作区中的文件,同时将删除添加到暂存区 git rm -f [file] 与版本不同修改过的文件,强制删除工作区中的文件,同时将删除添加到暂存区 git rm --cached [file] 会删除暂存区中的文件,但是会保留工作区中的文件,取消了版本控制
-
log
git log 列出所有commit,显示提交对象的哈希值,作者、提交日期、和提交说明 git log [file] 显示文件的哈希值,作者、提交日期、和提交说明
-
reset
[commit]
:提交点哈希,如1a1e91bf37git reset —soft [commit] 只改变提交点,暂存区和工作目录的内容都不改变 git reset —mixed [commit] 改变提交点,同时改变暂存区的内容 git reset —hard [commit] 提交点、暂存区、工作区的内容都会被修改到与提交点完全一致的状态 git reset --hard HEAD 让工作区回到上次提交时的状态
-
remote
git remote add origin [url] 添加远程仓库
-
push
[remote]
:远程主机名,如origin
git push [remote] [branch] 上传本地指定分支到远程仓库 git push -u origin master 提交到具体的分支 -u:将本地仓库分支与远程仓库分支一起合并。 origin:远程仓库的意思,如果这个仓库是远程的那么必须使用这个选项。 master:提交本地matser分支仓库 git push -f|--force [remote] 强行推送当前分支到远程仓库,即使有冲突 git push --all [remote] 推送所有分支到远程仓库
-
clone
git clone 从远程仓库复制到本地
-
fetch
git fetch 从远程仓库抓取全部分支到本地,但不与本地的合并
-
pull
git pull 下载更改并直接合并/集成到HEAD中