一、版本控制
1.1 什么是版本控制
版本控制是一种记录一个或若干个文件内容变化,以便将来查阅特定版本修订情况的系统。可以对任何类型的文件进行版本控制。
1.2 为什么需要版本控制
有了版本控制就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态。并且可以很清晰对比出修改点,从而找出问题出现的原因。
1.3 版本控制分类
分类 | 优点 | 缺点 |
---|---|---|
集中式版本控制系统 | * 管理方便,逻辑明确,操作简单,上手快。 * 易于管理,集中式服务器更能保证安全性。 * 代码一致性非常高。 * 有良好的目录级权限控制系统。 |
* 必须联网。如果不能连接到服务器上,基本上不可以工作,如果服务器不能连接上,就不能提交,还原,对比等等。 * 分支的管控方式不灵活 * 对服务器性能要求高,数据库容量经常暴增,体量大。 |
分布式版本控制系统 | * 适合分布式开发,每一个个体都可以作为服务器。 * 公共服务器压力和数据量都不会太大。 * 速度快、灵活,分支之间可以任意切换。 * 离线工作,不影响本地代码编写, |
* 学习周期相对而言比较长 * 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。 |
二、认识 Git
2.1 Git 简史
Linux 内核项目组当时使用分布式版本控制系统 BitKeeper 来管理和维护代码。但是,后来开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统,并且对新的版本控制系统做了很多改进。
2.2 Git 与其他版本管理系统的主要区别
Git 与其他版本管理系统最主要的区别就是对待数据的方式。
大部分版本控制系统(CVS、Subversion、Perforce、Bazaar 等等)都是以文件变更列表的方式存储信息,这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异, 而 Git 采用的是直接记录快照的方式 。
2.3 Git 的三种状态
Git
有三种状态:
- 已提交(committed):数据已经安全的保存在本地数据库中。
- 已修改(modified):已修改表示修改了文件,但还没保存到数据库中。
- 已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
由此引入 Git
项目的三个工作区域的概念:
- Git 仓库(.git directoty)
- 工作目录(Working Directory)
- 暂存区域(Staging Area)
2.4 Git 基本工作流程
1. 在工作目录中修改文件。
2. 暂存文件,将文件的快照放入暂存区域。
3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
三、Git 安装
3.1 在 Linux 系统安装
yum install -y git
3.2 在 mac 系统安装
- 安装 homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- 安装 git
brew install git
3.3 在 Windows 系统安装
- 先前往官网 下载安装包
- 一路安装即可
3.4 初次运行 Git 的配置
- 打开命令行工具
- 配置用户信息
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
注:--global
选项表示全局应用。
- 检查配置信息,确认配置成功
git config --list
四、Git 快速入门
4.1 获取 Git 仓库
方式一:在现有目录中初始化仓库
1) 命令行工具进入现有目录
2) 执行 git init 命令
方式二:从服务器克隆一个现有 Git 仓库:
执行 git clon [url] 自定义本地仓库名称
4.2 记录更改到仓库
1) 检查当前目录状态:git status
2) 设置忽略文件: 在 .gitignore 文件中编辑规则
3) 提出更改(将更改内容提交到暂存区)
* 针对指定文件: git add filename
* 针对所有文件: git add *
* 支持通配符形式: git add *.txt
4) 提交更新:
git commit -m "本次提交内容"
5) 跳过暂存区更新(该命令下不需要执行 git add 步骤):
git commit -a -m "本次提交内容"
6) 移除文件(从暂存区移除):
git rm filename
7) 对文件重命名:
git mv filename newFilename
4.3 推送更改到远程仓库
-
如果本地仓库和远程服务器没有连接,需要先建立连接:
git remote add origin serverUrl
-
将改动推送至远端仓库:
git push origin master
注:分支的概念我们之后会详细介绍,这么只需要知道
master
表示主分支,可以换成其他你想要的分支。
4.4 远程仓库重命名和移除
-
重命名
git remote rename 原名称 新名称
-
移除
git remote rm 仓库名称
4.5 查看提交记录
-
查看所有的提交记录
git log
-
查看指定人的提交记录
git log --author=username
-
查看最近 n 条记录
git log -n
4.6 撤消操作
-
覆盖上次提交(将暂存区的文件提交)
git commit --amend
-
取消暂存的文件
git reset filename
-
撤消对文件的修改:
git checkout -- filename
-
丢弃本地所有更改,以远程仓库为主
git fetch origin git reset --hard origin/master
4.7 其他远程仓库操作
-
抓取
git fetch [remote-name]
-
查看
git remote show [remote-name]
4.8 别名
有些命令过长导致我们操作体验感很差,Git 提供了别名操作可以让我们将长命令转为短小的命令
git config --global alias.短命令 原来命令
例如:
git config --global alias.ci commit
之后我们只需要使用 git ci
就可以执行提交操作了。
4.9 帮助
有些命令记不住,可以通过 git help
命令获取帮助。例如,要想获得 config 命令的手册:
git help config
五、Git 分支
5.1 相关概念
分支:
每一次提交创建的点连接成的线叫做分支。
master 分支:
在 Git 仓库创建的时候就会默认生成的一个 master 分支也叫主分支,其他所有的分支都围绕这个分支做扩展。
子分支:
在 master 分支的基础上创建的分支叫做子分支,它是独立存在的和主分支互不干扰。
指针:
每一根分支中都会有一个指向这个分支的指针,这个指针指向了当前版本库中使用的提交版本,也就是指向分支线上指定的点。master 分支就有一个master指针,其他分支的指针也有对应名称的指针。
HEAD 指针:
指向当前版本库使用的分支指针。
5.2 分支的好处
- 多人协同工作,互不影响
- 可以并行开发多个新功能
5.3 分支相关命令
新建分支
git branch 新分支名称
切换分支
git checkout 新分支名称
新建、切换合并命令
git checkout -b 新分支名
切换到主分支
git checkout master
合并分支(可能存在冲突)
git merge 新分支名
查看所有分支
git branch
删除新分支
git branch -d 新分支名称
将分支推送远程仓库
git push origin
六、服务器上的 Git
在多人协作的时候有一台可靠的公用仓库是一个非常实用的方案。
6.1 协议
Git 支持以下几种协议:
- 本地协议(Local)
- HTTP 协议
- SSH(Secure Shell)协议
- Git 协议
关于这几种协议的优缺点你们可以参考 服务器上的 Git - 协议
6.2 在服务器上架设 Git 仓库
相比于只是单单在服务器搭建一个 Git 仓库来说,选择更现代,功能更全的 Git 服务器是一个更好的选择。推荐的几个好用的 Git 服务器:
- GitLab
- Gogs
以上几个 Git 服务器都提供了开源版本,可以在我们自己的服务器上搭建。
6.3 第三方托管
如果不想自己搭建的话,也可以直接采用现成的第三方托管。