Git基础篇

1、版本控制

如果在开发团队中没有使用版本控制,多个开发人员共同负责同一个软件或文档的开发,每个人在各自的电脑上有整个软件文档的备份,并对之实施编程开发,在分别完成各自任务之后,再通过文本比对工 具将各自机器上的不同版本的程序整合到一台机器上。没有进行版本控制或者版本控制本身缺乏正确的流程管理,在软件开发过程中将会引入很多问题,如软件代码的一致性、软件内容的冗余、软件过程的事务性、软件开发过程中的并发性、软件源代码的安全性,以及软件的整合等问题。

版本控制的目的是实现开发团队并行开发、提高开发效率的基础。其目的在于对软件开发进程中文件或目录的发展过程提供有效的追踪手段,保证在需要时可回到旧的版本,避免文件的丢失、修改的丢失和相互覆盖,通过对版本库的访问控制避免未经授权的访问和修改,达到有效保护企业软件资产和知识产权的目的。

版本控制的功能在于跟踪记录整个软件的开发过程,包括软件本身和相关文档,以便对不同阶段的软件及相关文档进行表示并进行差别分析,对软件代码进行可撤消的修改,便于汇总不同开发人员所做的修改,辅助协调和管理软件开发团队。

2、版本控制分类

2.1 本地版本控制

记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS。
在这里插入图片描述

2.2 集中版本控制(SVN)

所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改
在这里插入图片描述
缺点:所有的版本数据都存在服务器上,用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品:SVN、CVS、VSS

2.3 分布式版本控制(Git)

每个人都拥有全部的代码,所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。

不会因为服务器损坏或者网络问题,造成不能工作的情况!
在这里插入图片描述

3、版本控制工具

1、工程设计领域中使用版本控制管理工程蓝图的设计过程。在 IT 开发过程中也可以使用版本控制思想管理代码的版本迭代。
2、关系:
思想:版本控制
实现:版本控制工具

3.1 Visual Source Safe(简称VSS)

VSS是美国微软公司的产品,目前常用的版本为6.0版。VSS是配置管理的一种很好的入门级的工具。

易学易用是VSS的强项,VSS采用标准的windows操作界面,只要对微软的产品熟悉,就能很快上手。 VSS的安装和配置非常简单,对于该产品,不需要外部的培训(可以为公司省去一笔不菲的费用)。只 要参考微软完备的随机文档,就可以很快的用到实际的工程当中。

3.2 Concurrent Version System(简称CVS)

CVS是开发源代码的配置管理工具,其源代码和安装文件都可以免费下载。

CVS是源于unix的版本控制工具,对于CVS的安装和使用好对unix的系统有所了解能更容易学习, CVS的服务器管理需要进行各种命令行操作。目前,CVS的客户端有winCVS的图形化界面,服务器端也 有CVSNT的版本,易用性正在提高。

3.3 SVN

SVN全名Subversion,即版本控制系统。

SVN与CVS一样,是一个跨平台的软件,支持大多数常见的操作系统。作为一个开源的版本控制系统,Subversion管理着随时间改变的数据。 这些数据放置在一个中央资料档案库中。 这个档案库很像一 个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。Subversion 是一个通用的系统, 可用来管理任何类型的文件, 其中包括了程序源码。

3.4 Git

Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理.

Git 是 Linus Torvalds(Linux之父) 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开 发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得 BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 近就迁移到 Git 上来了,很多 Freedesktop 的项目也迁移到了 Git 上。

3.5 Git 与 SVN 区别

  • 1、Git 是分布式的,SVN 不是:
    这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,核心的区别。

  • 2、Git 把内容按元数据方式存储,而 SVN 是按文件:
    Git所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.git 等的文件夹里。

  • 3、Git 分支和 SVN 的分支不同:
    分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。 Git 分支是指针指向某次提交,而 SVN 分支是拷贝的目录。这个特性使 Git 的分支切换非常迅速,且创建成本非常低。 Git 有本地分支,SVN 无本地分支。在实际开发过程中,经常会遇到有些代码没写完,但是需紧急处理其他问题,若我们使用 Git,便可以创建本地分支存储没写完的代码,待问题处理完后,再回到本地分支继续完成代码。

  • 4、Git 没有一个全局的版本号,而 SVN 有:
    目前为止这是跟 SVN 相比 Git 缺少的大的一个特征。

  • 5、Git 的内容完整性要优于 SVN:
    Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网 络问题时降低对版本库的破坏。

4、Git安装

Git的下载可以到官网下载安装,但是一般下载比较慢,我们可以使用阿里云国内镜像下载:

https://npm.taobao.org/mirrors/git-for-windows/

步骤关键截图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
安装完成后在任意文件夹中右键,出现此图标即表示安装成功:
在这里插入图片描述
Git Bash:Unix与Linux风格的命令行,使用最多,推荐最多

Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令

Git CMD:Windows风格的命令行

5、Git远程托管仓库

Git技术作为一种工具对代码进行暂时存储以及上传,但它并不存储代码,而Git远程仓库既是负责对代码的托管保存。

5.1 GitHub

GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管, 故名gitHub。 gitHub于2008年4月10日正式上线,除了git代码仓库托管及基本的 Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。目前,其注册用户已经超过350万,托管版本数量也是非常之多,其中不乏知名开源项目 Ruby,on Rails、jQuery、 python等。

5.2 GitLab

GitHub 和 GitLab 都是基于 web 的 Git 仓库,使用起来二者差不多,它们都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化云存储的场所。

GitHub 作为开源代码库,拥有超过 900 万的开发者用户,目前仍然是火的开源项目托管平台, GitHub 同时提供公共仓库和私有仓库,但如果使用私有仓库,是需要付费的。 GitLab 解决了这个问题,你可以在上面创建私人的免费仓库。

GitLab 让开发团队对他们的代码仓库拥有更多的控制,相比较 GitHub , 它有不少特色:
(1) 允许免费设置仓库权限;
(2) 允许用户选择分享一个 project 的部分代码;
(3) 允许用户设置 project 的获取权限,进一步提升安全性;
(4) 可以设置获取到团队整体的改进进度;
(5) 通过 innersourcing 让不在权限范围内的人访问不到该资源;

所以,从代码的私有性上来看,GitLab 是一个更好的选择。但是对于开源项目而言,GitHub 依然是代 码托管的首选。

5.3 Gitee

码云(Gitee)是 OSCHINA 推出的代码托管协作开发平台,支持 Git 和 SVN,提供免费的私有仓库拖管。2016 年推出企业版,提供企业级代码托管服务,成为开发领域领先的 SaaS 服务提供商。

使用 GitHub 时,国内的用户经常遇到的问题是访问速度太慢,有时候还会出现无法连接的情况。如果你希望体验 Git 飞一般的速度,可以使用国内的代码托管与开发协作平台 —— Gitee。除了访问速度快以外,Gitee 还提供了免费的私有仓库供个人开发者使用。同时,Gitee 也有着国内数一数二的开源生态,这里有非常多的优秀开源项目和开发者,你可以在这里和他们无障碍地沟通交流,不管是找开源 项目还是分享自己的开源项目,Gitee 都是极佳的选择。

作为国内代码托管平台的佼佼者,目前已经有超过 500 万名开发者在 Gitee 上托管了 1000 余万个代码 仓库,而其提供了研发管理、代码托管、文档管理服务的企业版的服务客户也超过了 10 万家。

5.3.1 基本概念

(1) 仓库(Repository)
仓库即你的项目,你想在github上开源一个项目,那就必须要新建一个repository,如果你开源的项目 多,那你拥有的仓库也就很多

(2) 收藏(star)
仓库主页的star按钮,意思是收藏项目的人数。

(3) 复制克隆项目(fork)
在原项目的基础上新增代码和结构,也可以理解成拿别人的代码进行二次加工。Fork后,会在自己账 号下,生成自己的相同仓库

(4) 发起请求(pull request,简称PR)
这个是基于fork的,当其他人改进完代码后,想将这个项目合并到原项目,则这个时候会给你发起一 个pull request。如果接受了请求,这个时候就可以拥有改进的项目了

(5) 关注(watch)
即观察,可以随时看到被关注项目的更新

(6) 事务卡片(Issue)
发现代码有bug,但是目前还没成型,需要讨论时使用 当别人发现你的问题时,会提个lssue

(7) Gitee主页
账号创建完后,点击导航栏gitee图标即可进入主页。左侧显示功能列表,右侧显示仓库动态

(8) 仓库主页
仓库主页主要显示项目的信息,如:代码,版本,收藏,关注,fork等

6、Git的工作区域

6.1 基本工作流程

git的工作流程一般是这样的:

1、在工作目录中添加、修改文件;

2、将需要进行版本管理的文件放入暂存区域;

3、将暂存区域的文件提交到git仓库。

因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
在这里插入图片描述

  • 工作区:就是你平时存放项目代码的地方

  • 暂存区:用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息

  • 仓库区(或本地仓库):就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本

6.2 Git仓库概念

在Git中,我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Git来实现版本管理,Git都能跟踪并记录在该目录中发生的所有更新。
注意:此仓库非远程仓库,初学者概念不要混淆。
在这里插入图片描述

  • Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
  • WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间,除了.git之外的都属于工作区。
  • .git:存放Git管理信息的目录,初始化仓库的时候自动创建。
  • Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
  • Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。
  • Stash:是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。

6.3 Git分支

Git 把我们之前每次提交的版本串成一条时间线,这条时间线就是一个分支。截止到目前只有一条时间线,在git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

(1) 一开始的时候,master分支是一条线,git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点
在这里插入图片描述
(2) 当我们创建新的分支,例如dev时,git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
在这里插入图片描述
git创建一个分支很快,因为除了增加一个dev指针,改变HEAD的指向,工作区的文件都没有任何变化。

(3) 不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
在这里插入图片描述
(4) 假如我们在dev上的工作完成了,就可以把dev合并到master上。git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
在这里插入图片描述
(5) 合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
在这里插入图片描述

Git的分支机制用通俗的话来说就是:从主分支拷贝一份出来写,可以并行写对主分支没有影响,写完也可以合并回去。

7、Git命令

7.1 仓库

//在某个文件夹下执行该命令,代表该目录作为代码库交由git管理
 git init
//新建一个目录,将其初始化为git代码库
 git init [文件名]
//克隆操作:从远程仓库下载代码带本地,并接受git管理
 git clone [远程仓库地址]

7.2 配置签名

在多人合作开发场景下,设置签名用于在提交代码时区分不同开发人员的身份

注意:这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系。

项目级别/仓库级别:仅在当前本地库范围内有效

git config user.name '用户名'
git config user.email '邮箱'
//信息保存位置:./.git/config
git config --list //查看设置信息

系统用户级别:登录当前操作系统的用户范围

git config --global user.name '用户名'
git config --global user.email '邮箱'
//信息保存位置 : ~/.gitconfig
git config --list //查看设置信息

注意:该设置在gitee仓库主页显示谁提交的文件,如果想要修改用户信息,则将该命令再执行一次

7.3 文件操作

//添加指定文件到缓存区
 git add [文件名1] [文件名2]

//添加指定目录到缓存区,包括子目录
 git add [目录名]

//添加当前目录的所有文件到缓存区
 git add .

//提交缓存区到仓库区
 git commit -m [提交备注]

//提交暂存区的指定文件到仓库区
 git commit [file1] [file2] ... -m [提交备注]

// 使用一次新的commit,替代上一次提交
// 如果代码没有任何新变化,则用来改写上一次commit的提交信息
 git commit --amend -m [message]

// 查看本地仓库的状态
 git status

// 以简短模式查看本地仓库的状态
// 会显示两列,第一列是文件的状态,第二列是对应的文件
// 文件状态:A 新增,M 修改,D 删除,?? 未添加到Git中
 git status -s

// 切换到已存在的指定分支
 git checkout <分支名称>

// 创建并切换到指定的分支,保留所有的提交记录
// 等同于 "git branch" 和 "git checkout" 两个命令合并
 git checkout -b <分支名称>

// 把指定的分支合并到当前所在的分支下
 git merge <分支名称>

// 从远程仓库获取最新版本。
 git pull

// 把本地仓库的分支推送到远程仓库的指定分支
 git push <远程仓库的别名> <本地分支名>:<远程分支名>

// 删除指定的远程仓库的分支
 git push <远程仓库的别名> :<远程分支名>
 git push <远程仓库的别名> --delete <远程分支名>

// 重置暂存区,但文件不受影响
// 相当于将用 "git add" 命令更新到暂存区的内容撤出暂存区,可以指定文件
// 没有指定 commit ID 则默认为当前 HEAD
 git reset [<文件路径>]

// 打印所有的提交记录
 git log

// 打印指定数量的最新提交的记录
 git log -<指定的数量>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值