版本控制
什么是版本控制?
Reversion Control是开发时用于管理对文件,目录或者工程等等内容的修改历史,方便查看更改历史记录,备份以便恢复以前版本的软件工程技术。多人开发必然使用版本控制!
主流的版本控制工具
- 本地版本控制:记录文件每次更新,对每个版本进行快照或者是记录补丁文件,适合个人用
- 集中版本控制(SVN) :所有的版本数据保存在服务器上,开发者从服务器上同步更新或上传自己的修改,可能会出现以下问题:
- 多人同时提交修改或修改起冲突
- 而且用户本地只有自己以前所同步的版本,不联网则连接不到服务器,无法切换版本或在某个分支工作
- 加之所有数据都存储在单一的服务器上,若是该服务器损坏(当然可以定期备份)
- 分布式版本控制(Git) :所有的版本信息仓库全部同步到本地的每个用户,可以在本地查看所有版本历史,由于每个用户保存的是所有的版本数据,只要有一个用户的设备没有就可以恢复所有的数据,但这增加了本地存储空间的占用
- Git和SVN(Subversion)区别:
- 前者是分布式版本控制,没有中央服务器,每个用户的电脑都是一个完整的版本库,只需要互相推送自己的修改,Git可以直接看到修改的文件和文件
- 后者是集中版本控制,版本库放置在中央服务器,对网络带宽要求较高
Git的历史
-
同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。
-
Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991 - 2002年间)。到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。
-
到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。也就是后来的 Git!
-
Git是目前世界上最先进的分布式版本控制系统。
Git是免费、开源的,最初Git是为辅助 Linux 内核开发的,来替代 BitKeeper!
Git配置
打开 git官网 https://git-scm.com/ ,下载git对应操作系统的版本。
所有东西下载慢的话就可以去找镜像!
- 官网下载太慢,我们可以使用淘宝镜像下载:http://npm.taobao.org/mirrors/git-for-windows/
- Git Bash:Unix与Linux风格类似,使用最多
- Git CMD:Windows风格的命令行
- Git GUI:图形界面的Git,不建议初学者使用,先熟悉常用命令
后期使用Git Bash频率更高,所以要熟悉基本的Linux命令
- 改变目录
cd - 回退上一级目录
cd .. - 显示当前所在目录路径
pwd - 清屏
clear - 列出当前目录下的所有文件,只不过ll所列内容更为详细
ls/ll - 新建一个文件(带扩展)
touch - 删除一个文件(带扩展)
rm - 新建一个目录(文件夹)
mkdir - 删除一个文件夹
rm -randrm -rf /(递归删除,不要在Linux尝试) - 移动文件
mv 文件名(带扩展) 目的目录 - 初始化终端
reset - 查看历史命令行
history - 推出终端
exit - 注释
#
Git配置
- 查看配置
git -config -l - 查看系统或者本地配置
git config --system/global --list - 系统配置默认在Git安装目录下
- 本地配置默认在c盘当前登录用户目录下
Git工作原理
Git分区
- 工作目录:存放项目代码的地方
- 暂存区:临时存放改动,事实上也是一个文件,保存即将提交到文件列表信息
- 仓库区(或本地仓库):就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
- 远程仓库:托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
工作流程
- 在工作目录中添加、修改文件;
- 将需要进行版本管理的文件放入暂存区域;
- 将暂存区域的文件提交到git仓库。
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
Git项目搭建
对工作区开始进行版本控制
- 本地仓库初始化
bash
git init
- 克隆远程仓库
bash
git clone [url]
Git相关命令
- 状态:
- Untracked : 未跟踪,此文件在文件夹中,但并没有加入到git库,不参与版本控制。通过
git add状态变为Staged。 - Unmodify : 文件已经入库,未修改,即版本库中的文件快照内容与文件夹中完全一致。这种类型的文件有两种去处,如果它被修改,而变为
Modified。如果使用git rm移出版本库,则成为Untracked文件 - Modified : 文件已修改,仅仅是修改,并没有进行其他的操作。这个文件也有两个去处,通过
git add可进入暂存staged状态,使用git checkout则丢弃修改过,返回到unmodify状态,这个git checkout即从库中取出文件,覆盖当前修改! - Staged : 暂存状态。执行
git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态。执行git reset HEAD filename取消暂存,文件状态为Modified
- Untracked : 未跟踪,此文件在文件夹中,但并没有加入到git库,不参与版本控制。通过
- 查看状态
bash
- 指定文件
git status [文件名]
- 所有文件
git status
- 提交修改
bash
git commit -m "提交信息"
- 忽略文件
- 有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等
- 在主目录下建立".gitignore"文件,此文件有如下规则:
- 忽略文件中的空行或以井号(#)开始的行将会被忽略。
- 可以使用Linux通配符。例如:星号代表任意多个字符,问号(?)代表一个字符,方括号(abc)代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
- 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
- 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
- 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
- 在.gitnore文件下设置,不会在git的管控下
bash
*.txt # 批量txt文件被忽略
temp/ # temp目录下所有文件和目录
/temp # temp以上的所有文件和目录