GIT
GIT简介
1. 什么是
git是一个开源的分布式版本控制系统,用于高效的管理各种大小项目和文件
2. 代码管理工具的用途
防止代码丢失,做备份
项目的版本管理和控制,可以通过设置节点进行跳转
建立各自的开发环境分支,互不影响,方便合并
在多终端开发时,方便代码的相互传输
3. git的特点
git是开源的,多在
git是分布式的项目管理工具(
git数据管理更多样化,分享速度快,数据安全
git拥有更好的分支支持,方便多人协调
4. git安装
GIT使用
git结构
初始配置
配置所有
配置当前用户:
配置当前项目:
[选项 名字 -配置用户名
user.email 邮箱 -配置用户邮箱
core.editor 编译器 -配置编译器
查看配置信息:
[选项前面加 —edit 修改 —unset 删除
基本命令
1. 初始化仓库
2. 查看本地仓库状态
3. 将工作区内容添加到暂存区
git add [files…] -添加一个或者多个
git add * -添加所有文件(不包含隐藏文件)
git add .[file] -添加隐藏文件
4. 取消文件暂存记录
git rm —cached [files…] -撤销一个或者多个
5. 将文件同步到本地仓库
git commit 文件名 -m [同步信息] 不写文件名,把所有内容提交到本地仓库
说明:
git commit —amend -m “新的提交信息
6. 查看
git config —global -l 查看全局变量
git config —local -l 查看本地变量
git log -最新的操作排在最上面
git log —pretty=online
7. 比较工作区文件和仓库文件差异
git diff [file]
在工作中,开发完一个分支commit之前,我们通常要确定一下自己在什么地方更改了代码,看看有没有误操作代码,这个时候,git diff命令闪亮登场~
git diff:获得当前工作目录和上次提交与本地索引的差距,也就是可以获取本次你在什么地方修改了代码。
git diff file_name:获取指定文件的修改
执行git diff获得下图部分截图:
我们来解读一下上述图的结构,便于我们更好的理解我们的修改。 获取的结果大体的结构是:
# 比较a和b的状态
git diff <a> <b>
diff –-git a/f1 b/f1
#
index 8f86bb9..d74049c 100644
--- a/f1
+++ b/f1
@@ -1,7 +1,7 @@
code
code
code
-code
+code
code
code
code
- 第一行a 表示第一个变量 b表示第二个变量f1为文件名
- 第二行index表示索引区域 后面跟着两个状态的SHA1值 最后6位数字表示文件属性和模式,100表示普通文件644表示文件权限
- 第三四行 “-“表示a状态,”+++”表示b状态。
- 第五行表示代码变动的位置,用两个@作为起首和结束
@@ -1,7 +1,7 @@ “-1,7″分成三个部分:
-表示a状态,+表示b状态。”1″表示第1行,“7″表示连续7行。
合在一起,就表示下面是第一个文件从第1行开始的连续7行。 同样的,
- 第三部分是变动的具体内容,每一行最前面的标志位:“-”代表a状态有b状态没有的,“+”表示b状态有a状态没有,无标志ab共同有的。
其他用法
$ git diff —cached 上面的命令会显示你当前的索引和上次提交间的差异;
$ git diff HEAD 上面这条命令会显示你工作目录与上次提交时之间的所有差别,这条命令所显示的 内容都会在执行”git commit -a”命令时被提交。
$ git diff test 上面的命令会显示你当前工作目录与另外一个叫’test’分支的差别。
$ git diff HEAD — ./lib 上面这条命令会显示你当前工作目录下的lib目录与上次提交之间的差别(或者更准确的 说是在当前分支)。
$ git diff —stat 上面的命令会统计一下有哪些文件被改动,有多少行被改动
git config --global diff.tool vimdiff
git config --global difftool.prompt false
git config --global alias.d difftool
# 使用
git difftool <a> <b>
8. 放弃工作区文件修改
9. 从仓库区恢复文件
10.移动或者删除文件
git mv [file] [path]
git rm [files]
这两个操作会修改工作区内容,同时将操作记录提交到暂存区。
@扩展延伸
在.gitignore忽略规则简单说明#
表示此为注释
.a 表示忽略所有 .a 结尾的文件
!lib.a 表示但
/TODO 表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ 表示忽略 build/目录下的所有文件,过滤整个
doc/.txt 表示会忽略
bin/: 表示忽略当前路径下的
/bin: 表示忽略根目录下的
/.c: 表示忽略
debug/.obj: 表示忽略
/foo: 表示忽略
a//b: 表示忽略
!/bin/run.sh 表示不忽略
.log: 表示忽略所有 .log 文件
config.php: 表示忽略当前路径的 config.php 文件
/mtk/ 表示过滤整个文件夹
.zip 表示过滤所有
/mtk/do.c 表示过滤某个具体文件
.gitattributes
文件允许你指定由 git 使用的文件和路径的属性
定义结尾行,主要用于解决Windows和linux的的换行不一样的问题
.js eol=lf
.jsx eol=lf
*.json eol=lf
版本控制
1. 退回到上一个
git reset —hard HEAD^ HEAD相当于一个头指针
一个
2. 退回指定的
git reset —hard [commit_id] —只用填前七位
3. 查看所有操作记录
4. 创建标签
在项目的重要
git tag [tag_name] [commit_id] -m [message]
说明:
5. 查看标签
git tag 查看标签列表 最上面是最早的标签版本
git show [tag_name] 查看
6. 去往某个标签节点
7. 删除标签
版本命名规则
我们常见的版本命名格式为
[name].x.y.z-[state]
- name为可选字段,一般为 v,表示 version
- x.y.z 为各版本的序号,遵循 语义化版本命名规范
实际上基于此规范,不应该在版本前出现 name 字段. - state 可选字段,表示版本状态,例如 b 表示 beta 测试版,其他常见状态,后有详述
语义化版本命名规则
该规则对版本的迭代命名,做了很好的限制.
核心规则如下.
序号 | 格式要求 | 说明 |
---|---|---|
x | 非负整数 | 主版本号(major),进行不向下兼容的修改时,递增主版本号 |
y | 非负整数 | 次版本号(minor),保持向下兼容,新增特性时,递增次版本号 |
z | 非负整数 | 修订号(patch),保持向下兼容,修复问题但不影响特性时,递增修订号 |
- 0.y.z 表示开发阶段,一切可能随时改变,非稳定版。
- 1.0.0 界定此版本为初始稳定版,后面的一切更新都基于此版本进行修改。
版本状态
| 描述方式 | 说明 | 含义 | | —- | —- | —- | | α或a | alpha 版 | 内测版本,内部测试的版本,bug 较多 | | β或b | beta 版 | 公测版本,给外部进行测试的版本,有缺陷 | | γ或g | Gamma 版 | 相当成熟的测试版,于发行版相差无几 | | rc | Release Candidate | 是前面三种测试版的进一步版本,实现了全部功能,清除了大部分 bug,接近发布倒计时,有时会进一步细分为 rc1,rc2 |
实际上大部分前端工具均遵守上述规则
在商业软件中还会见到如下字段.
版本限定
在进行包管理时,为了保证安装依赖的兼容性.
必须对依赖包版本进行限定.参考 npm 限定描述
举例如下
{ “devDependencies”: { “karma”: “0.13.22” } }
表示安装 0.13.22 版本的 karma.
为了方便理解,版本限定的语法简述为为 [范围描述]<版本号描述>
- 范围描述可选,必须配和版本描述确定范围,无法独立存在严格来讲对 ~,^ 的表述需要结合具体的包管理工具和版本号规则来确定.但是对于一般使用记住如下原则.
^ 是确保版本兼容性时,默认对次版本号的限定约束
~ 是确保版本兼容性时,默认对补丁号的约束利用 ^,~ 的意义在于确保工具包对依赖版本的兼容性,排除主版本更迭,
造成依赖失效的可能.- < 小于某一版本号
- <= 小于等于某一版本号
大于某一版本号
= 大于等于某一版本号
- = 等于某一版本号,没有意义和直接写该版本号一样
- ~ 基于版本号描述的最新补丁版本
- ^ 基于版本号描述的最新兼容版本
- 某个范围,他应该出现在两个版本描述中间,实际上语法应为 <版本描述>-<版本描述>,写在此处为了统一
- 版本描述0.x 警惕这种版本,说明该依赖还未稳定(如果它遵守语义化命名的话),此外由于 0.x 版本随时可能改变,此时 ^,~ 的都表示为对补丁版的限制.
- 通配符,类似 glob 模式 *
- x,X 约等于 * 号,通常用于次版本和补丁的通配.
相关举例如下
< 1.2.3 小于1.2.3 的版本均可
= 1.2.3 只支持等于1.2.3 的版本
<= 1.2.3 只支持小于等于1.2.3 的版本
> 1.2.3 只支持大于 1.2.3 的版本
>= 1.2.3 只支持大于等于 1.2.3 的版本
1.2.3-2 支持 >=1.2.3 <3.0.0 的版本
1.x.1 支持 >=1.0.1 <1.1.0 的版本
* 支持 >= 0.0.0 的版本
"" 同 *
1 表示 >=1.0.0 <2.0.0 其余任意位置为空相似
1.0 >= 1.0.0 < 1.1.0
~1.1.1 >=1.1.1 <1.2.0
~1.1 >=1.1.0 <1.2.0
~1 >=1.0.0 <2.0.0
^1.1.1 >=1.1.1 <2.0.0
^0.1.1 >=0.1.1 <0.2.0 注意这里,不要以为是 0.1.1-1.0.0 之间
^0.0.1 >=0.0.1 <0.0.2 同上,请注意
注意大部分包管理工具均遵守上述规则,但是在进行版本限定时,请参考包管理工具的配置项说明,确定语法格式.
总结
核心命名规则
版本号通常称为 x.y.z
~ 在依赖版本兼容下,最近的补丁版
- ^ 在依赖版本兼容下,最近的次版本
重点是保证版本依赖的兼容性,不允许出现依赖的主版本号范围可变,即使你的开发包依旧可用
保存工作区
1. 保存工作区内容
git stash save [message]
说明:将工作区未提交的修改封存,让工作区回到修改前的状态
2. 查看工作区列表
3. 使用某个工作区
4. 删除工作区
git stash drop [stash@{n} 删除
git stash clear 删除所有保存的工作区
分支管理
定义:分支即每个人在原有代码(分支)的基础上建立自己的工作环境,单独开发互不干扰,完成开发工作后,再进行分支统一合并。
1. 查看分支情况
git branch
2. 创建分支
git branch [branch_name]
3. 切换工作分支
git checkout [branch_name]
git checkout -b [branch_name]
-b 工作区不存在则创建
4. 合并分支
git merge [branch_name]
冲突问题是合并分支过程中最为棘手的问题
当分支合并时,原分支和以前发生了变化就会产生冲突
当合并分支时添加新的模块(文件)时这种冲突可以自动解决,只需要自己决定
5. 删除分支
git branch -d [branch_name] 删除分支
git branch -D [branch_name] 删除没有被合并的分支
远程仓库
1. 什么是远程仓库
2. 共享仓库
在
创建步骤:
* 选择共享仓库目录,将该目录属主设置为当前用户
必须在用户目录(教学机为
mkdir gitrepo
chown tarena:tarena gitrepo -教学机上的当前用户为
将该目录初始化为
cd gitrepo
git init —bare [项目名.git
将
chown -R tarena:tarena [项目名.git
远程仓库操作命令
1. 添加远程仓库
git remote add [origin] [远程主机用户名@[远程主机地址:[绝对路径[项目名.git
[origin] 是自定义的远程主机名称,[远程主机用户名@[远程主机地址:[绝对路径[项目名.git 为[项目名.git的绝对路径在一般在home/远程主机用户名下。
2. 查看连接的主机
3. 删除远程主机
git remote rm [origin] -[origin]为远程主机名称
4. 将本地分支推送给远程仓库
将
第一次推送分支使用
git push -u [origin] master
后面的推送如果只连接了一个远程主机可以直接
如果连接了多个可以
5. 删除远程分支
git branch -a 查看所有分支
git push origin [:分支名 删除远程分支
6. 其他推送方法
git push —force [origin] 用于本地版本比远程版本旧时强行推送本地版本
git push origin [tag] 推送本地标签到远程
git push origin —tags 推送本地所有标签到远程
git push origin —delete tag [tagname] 删除远程仓库标签
7. 从远程获取项目
git clone [远程主机用户名@[远程主机地址:[绝对路径[项目名.git
获取到本地的项目会自动和远程仓库建立连接。且获取的项目本身也是个
8. 从远程获取最新代码
git pull
将远程分支
git fetch [origin] master:[tmp]
区别
pull将远程内容直接拉取到本地,并和对应分支内容进行合并
fetch将远程分支内容拉取到本地,但是不会和本地对应分支合并,可以自己判断后再使用
ssh-keygen 生成秘钥