版本迭代、版本管理器 ,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术
多人开发就必须要使用版本控制
常用的版本控制
- Git
- svn等
本地版本控制:记录文件每次的更新,可以对每个版本做一个快照,eg: version3 -> version2 -> version1
集中版本控制:将版本数据全部上传到服务器上便于管理
分布式版本控制:
每个人都拥有全部的代码!安全隐患
所有版本信息仓库全部同步到本地的每个用户,所以可以在本地查看所有版本历史,可以离线在本地提交,只需在联网时push到相应的服务器或者其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
不会因为服务器损坏或者网络问题,造成不能工作的情况
GIT | SVN |
---|---|
分布式版本控制系统 | 集中式版本控制系统 |
没有中央处理器,每个人电脑中都有一个完整版本库 | 版本库放在中央处理器中 |
工作的时候可以不联网 | 对网络带宽要求较高 |
版本的修改只需要用户间相互的推送 | 版本的修改需要用户和服务期间的推送 |
Git是目前世界上最先进的分布式版本控制系统
官网下载安装慢的话,去找一个镜像
卸载git
先删除环境变量,再卸载
mac下安装git:
1)使用国内镜像地址安装Homebrew :输入以下命令
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
2)安装git
brew install git
3)安装好之后先设置用户名邮箱地址:
git config --global user.name “yourname”
git config --global user.email “youremail”
Git Bash:Unix与Linux风格的命令行,使用最多,推荐
Git CMD:Windows风格的命令行
Git GUI :图形界面的Git,不建议初学者使用,尽量先熟悉常用命令
1)cd 改变目录
2)cd … 回退到上一个目录,直接cd进入默认目录
3)pwd 显示当前所在的目录路径
4)ls(ll) 都是列出当前目录中的所有文件,但ll列出的内容更为详细
5)touch 新建一个文件, eg: touch index.js就会在当前目录下新建一个index.js文件
6)rm 删除一个文件
7)mkdir 新建一个目录or新建一个文件夹
8)rm -r 删除一个文件夹, rm -r src 删除src目录
9)mv 移动文件 eg:mv index.html src
10)reset 重新初始化终端/清屏
11)clear 清屏
12)history 查看命令历史
13)help 帮助
14)exit 退出
15)#表示注释
所有的配置文件,其实都保存在本地
查看配置: git config -l
查看系统配置:git config --system --list
查看本地配置:git config --global --list
设置用户名邮箱地址:
git config --global user.name “yourname”
git config --global user.email “youremail”
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果再加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
- Workspace: 工作区,平时存放代码的地方
- Index/Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
- Reposity: 仓库区(或本地仓库),安全存放数据的位置,这里面有你提交所有版本的数据,其中HEAD指向最新放入仓库的版本
以上是本地的三个区域
- Remote:远程仓库,托管代码的服务器,可以简单的认为是你的项目组中的一台电脑用于远程数据交换
本地的三个区域确切的说应该是git仓库中HEAD指向的版本:
- Directory:就是一个整体,一个仓库,被git管理
- WorkSpace:需要git管理(进行版本控制)的文件和目录
- .git:存放git管理信息的目录,初始化仓库时建立(
git init
)- Index/Stage:暂存区,进入本地仓库钱,我们把所有的更新放在暂存区
- Local Repo:本地仓库,存放在本地的版本库,HEAD指向当前开发的分支,一般为创建分支之前指向主分支(master)
- Stash:隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态
git的工作流程
创建工作目录与常用命令
工作目录(workspace)一般是你希望Git帮助管理的文件夹;路径中建议不要有
日常使用需要记住下面六个命令
本地仓库搭建
有俩种办法:一种是创建全新的仓库,另一种是克隆远程仓库
1、创建全新的仓库,需要用Git管理的项目的根目录执行:
# 在当前目录新建一个Git代码库
$ git init
2、执行后可以看到,仅仅在项目中多出了一个.git目录,关于版本等的所有信息都在这个目录里面
克隆远程仓库
克隆远程目录,可以将远程服务器上的仓库完全镜像一份至本地
# 克隆一个项目和他的整个代码历史
$ git clone [url]
文件的四种状态
# 查看指定文件的状态
git status [filename]
#查看所有文件状态
git status
# git add . 添加所有文件到暂存区
# git commit -m "备注" 提交暂存区的内容到本地仓库并附加提交信息
在提交时忽略某些文件
在主目录下建立".gitignore"文件,规则如下:
1、文件中的空行或#开始的行将忽略
2、可以使用Linux通配符,eg:(*)代表任意多个字符;(?)代表一个字符,([abc])代表可选字符范围,({string1, string2})代表可选字符串…
3、名称最前面加一个感叹号(!),表示例外,其不被忽略
4、路径名称最前面是(/),表示忽略的文件再次目录下面,而子目录中的文件不被忽略
5、路径名称最后面是(/),表示忽略的此目录下该名称的字目录,而非文件
以斜杠"/“开头表示目录;”/“结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件;”/"开始的模式匹配项目跟目录;如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录。
更多规则参考:https://www.cnblogs.com/kevingrace/p/5690241.html
*.txt #忽略所有.txt结尾的文件
!lib.txt #除了lib.txt
/temp #仅忽略项目根目录下面的temp文件,但不包括/subdir/temp(就是仅仅忽略该项目根目录下面的temp文件夹,但不忽略该项目下字目录里面的文件夹)
build/ #忽略build/目录下的所有文件
doc/*.txt #忽略 doc/notes.txt 但不包括 doc/server/arch.txt(即不包括其子目录下的文件夹)
1)注册登陆,并新建仓库
2)克隆仓库到本地
git clone [url]
随后便可以在本地文件夹中添加文件,并且使用git add . 等命令提交同步至远程仓库
创建新仓库
git init
检出仓库
git clone /path/to/repository
git clone /username@host:/path/to/repository
工作流
本地仓库由git维护的三颗“树”组成。
1、工作目录working dir,持有实际文件
2、缓存区 Index,像一个缓存区,临时保存你的改动
3、 HEAD,指向最近一次提交后的结果
添加与提交
首先,你可以计划修改/改动,使用如下命令,将它们添加到缓存区中
git add <filename>
git add *
随后使用以后命令实际提交改动,会将改动提交到HEAD,但是还没有到远程仓库
git commit -m "代码提交信息"
推送改动
git push origin master
master可以是想要推送的任意分支
git remote add origin <server>
分支
不同分支相互间绝缘,创建仓库时,默认分支为master(也就是主分支),在其他分支上进行开发,完成后再将它们合并到主分支上
git checkout -b feature_x # 创建一个名为feature_x的分支
git checkout master # 切换回主分支
git branch -d feature_x # 将feature_x分支删除
git push origin <branch> # 将该分支推送至远端仓库,不然该分支就是 不为他们所见的
git push 命用于从将本地的分支版本上传到远程并合并。
命令格式如下:
git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分支名与远程分支名相同,则可以省略冒号:
git push <远程主机名> <本地分支名>
更新与合并
git pull # 更新本地仓库至最新改动,以在你的工作目录中获取(fetch)并合并(merge)远端的改动
git merge <branch> # 合并其他分支到当前分支
# 当上述合并发生冲突时,需要自己手动进行文件的合并,改完相应的文件之后,需要执行:
git add <filename>
# 在合并之前,也可以使用如下命令查看:
git diff <source_branch> <target_branch>
标签
软件发布时,可以为其创建一个标签:
git tag 1.0.0 xxxxx #创建一个叫做1.0.0的标签
# 后面的xxxx是你想标记的提交ID的前10位字符
git log #获取提交的
# 只要能保证ID唯一,不用10位也可以
替换本地改动
git checkout -- <filename> # 使用HEAD中的最新内容替换掉你的工作目录中的文件。已经添加到缓存区的改动,以及新文件,都不受影响
# 假如想丢弃本地所有的改动与提交,可以到服务器获取最新的版本并将你本地主分支指向到它
git fetch origin
git reset --hard origin/master #origin是远程主机名
工具
gitk # 内建的图形化git
git config color.ui true # 彩色的git输出
git config format.pretty oneline # 显示历史记录时,只显示一行注释信息
git add -i # 交互地添加文件至缓存区,也就是会询问
参考:
廖雪峰git教程
狂神说git教程
git使用简易指南