软件构造学习笔记2

  1.SCM VS VCS

 1.SCM

软件配置管理:追踪和控制软件的变化

软件的任何组成部分(源代码、数据、文档、硬件、各种环境)都可能随着软件生命周期的时间而更新。
软件配置项:软件中发生变化的基本单元

 

Baselines 基线

1)代表多个源代码文件的一组版本。
– 比如有三个文件,aaa.c、bbb.c和ccc.h。可以对这三个文件做一个基线,取aaa.c的版
本1.1,取bbb.c的版本1.3,取ccc.h的版本1.0。(1.1,1.3,1.0)就是一个基线。
2)代表文档的一个稳定状态。
– 比如有一个项目设计文档,当设计基本完成,开发即将开始的时候,需要把这个文档
固定下来,内容不能再频繁改变,否则开发人员就无所适从了,可能导致每个人所参
照的文档并不是同一个文档。
– 一个文档如果经过讨论被通过了,被固定了,就可以说这个文档被“基线化”了,然
后所有人就可以在这个“基线”的基础上工作。
– 文档不可能一成不变,所以当对文档的修改仍然会不断进行,但这种修改并不会随时
随地的添加到被“基线化”了的文档中去。因为既然是“基线”,就不能随便动。
– 到了一定时候,修改积累到一定程度,就需要把很多修改合并到原来的文档中去了,
并生成一个新版本的文档作为团队中所有的人的参考标准,并把老的版本淘汰掉。这
就叫做“基线提升”。

 

版本:软件特定时刻指派的唯一编号,作为身份标志。

各个术语介绍:

 

2.vcs

1.本地版本控制系统 仓库位于开发者本地机器,无法与他人合作工程

2.集中式版本控制系统 仓库位于独立服务器 支持开发者之间进行合作

3.分布式版本控制系统  仓库位于独立服务器和每个开发者的本地机器

2.一个SCM实例 Git 基本功能介绍

Git是一个分布式版本控制系统 一个 Git 仓库分为三个部分: .git 目录:本地的 CMDB

工作目录:本地文件系统

暂存区:.git 目录中的一个文件,隔离工作目录和 Git 仓库

Object Graph 对象图是一个有向无环图,描述了版本之间的演化关系。一条边A→B表示在版本 B 的基础上作出变化,形成了版本 A。

 

 

结构

一般:每个 commit 指向一个父亲

分支:多个 commit 可指向同一个父亲

合并:一个 commit 指向两个父亲 一个

“分支”只是一个指向 commit 的别名

HEAD 指向当前工作的 commit

结点 一个 commit 存储一个树形结点。tree 中包含了数个 blob;每个 blob 是一个压缩了的仓库文件,不保存文件名信息。

对于每个文件的每个版本(或是不同文件名但相同内容的文件),Git 只会存储一个 blob,而允许多个 commit tree 指向同一个 blob。 一个 commit 中与之前相比未发生变化的文件,无需重复存储。文件未发生变化,则后续多个版本始终指向同一个 blob;文件发生变化了,存储两份不同的 blob,两个版本指向不同的 blob。

 

传统 VCS 和 Git 对比 传统 VCS:存储版本之间的变化(行) Git:存储发生变化的文件(而非代码行), 不变化的文件不重复存储

 

git命令:

1.下载git 

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

因为git是分布式管理控制系统,故需要在下载后输入自己的名称和邮箱

2.创建版本库

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/

此时,本地的git仓库就创建好了

名词解释:1.工作区:即电脑里创建好的目录。

2.版本库:工作区的隐藏目录.git即为版本库,版本库中存入了暂存区,git 创建的第一个分支master ,以及指向master的HEAD指针,git add 命令就是将文件从本地目录传向暂存区。

 

 

$ git add yourfile

git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

2.git 远程仓库

第1步:创建SSH Key。

$ ssh-keygen -t rsa -C "youremail@example.com"

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。

首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:

 

 在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:

 

 在本地输入命令:

$ git remote add origin git@github.com:your account/learngit.git

这样远程仓库就创建成功了, git push 可以将本地仓库的文件push到远程仓库

$ git push -u origin master

实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

从现在起,只要本地作了提交,就可以通过命令:

$ git push origin master

想删除远程库,可以用git remote rm <name>命令。使用前,建议先用git remote -v查看远程库信息:

$ git remote -v
origin  git@github.com:michaelliao/learn-git.git (fetch)
origin  git@github.com:michaelliao/learn-git.git (push)
$ git remote rm origin

2,分支管理

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

 

 

 

次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。

 

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

$ git checkout -b dev

$git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev

 

 

新提交一次后,dev指针往前移动一步,而master指针不变:

$ git add readme.txt 
$ git commit -m "branch test"

 

 

切换回master分支:

$ git checkout master

 

 

dev上的工作完成了,就可以把dev合并到master上。

$ git merge dev

 

 

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

$ git branch -d dev

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>或者git switch <name>

创建+切换分支:git checkout -b <name>或者git switch -c <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>、

以上就是git的基础教程,更多细节请参看使用手册

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-06-13 21:02  rtwq  阅读(124)  评论(0)    收藏  举报