GIT

GIT简介

1. 什么是

git是一个开源的分布式版本控制系统,用于高效的管理各种大小项目和文件

2. 代码管理工具的用途

防止代码丢失,做备份
项目的版本管理和控制,可以通过设置节点进行跳转
建立各自的开发环境分支,互不影响,方便合并
在多终端开发时,方便代码的相互传输

3. git的特点

git是开源的,多在
git是分布式的项目管理工具(
git数据管理更多样化,分享速度快,数据安全
git拥有更好的分支支持,方便多人协调

4. git安装

sudo apt-get install git

GIT使用

git 的命令都要在项目目录下进行

git结构

Git - 图1Git - 图2
工作区(
暂存区(
仓库区(
远程仓库(
在本地仓库中,

初始配置

配置所有
配置当前用户:
配置当前项目:
[选项 名字 -配置用户名
user.email 邮箱 -配置用户邮箱
core.editor 编译器 -配置编译器
查看配置信息:
[选项前面加 —edit 修改 —unset 删除

基本命令

1. 初始化仓库


作用:将某个项目目录变为

2. 查看本地仓库状态

git status
说明:初始化创库后默认工作在

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获得下图部分截图:
Git - 图3
我们来解读一下上述图的结构,便于我们更好的理解我们的修改。 获取的结果大体的结构是:

  1. # 比较a和b的状态
  2. git diff <a> <b>
  3. diff –-git a/f1 b/f1
  4. #
  5. index 8f86bb9..d74049c 100644
  6. --- a/f1
  7. +++ b/f1
  8. @@ -1,7 +1,7 @@
  9. code
  10. code
  11. code
  12. -code
  13. +code
  14. code
  15. code
  16. code
  1. 第一行a 表示第一个变量 b表示第二个变量f1为文件名
  2. 第二行index表示索引区域 后面跟着两个状态的SHA1值 最后6位数字表示文件属性和模式,100表示普通文件644表示文件权限
  3. 第三四行 “-“表示a状态,”+++”表示b状态。
  4. 第五行表示代码变动的位置,用两个@作为起首和结束

@@ -1,7 +1,7 @@ “-1,7″分成三个部分:
-表示a状态,+表示b状态。”1″表示第1行,“7″表示连续7行。
合在一起,就表示下面是第一个文件从第1行开始的连续7行。 同样的,

  1. 第三部分是变动的具体内容,每一行最前面的标志位:“-”代表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 上面的命令会统计一下有哪些文件被改动,有多少行被改动

  1. git config --global diff.tool vimdiff
  2. git config --global difftool.prompt false
  3. git config --global alias.d difftool
  4. # 使用
  5. git difftool <a> <b>

8. 放弃工作区文件修改

git checkout — [file]

9. 从仓库区恢复文件

git checkout [file]

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. 查看所有操作记录

git reflog 最上面的为最新记录,可以利用

4. 创建标签

在项目的重要
git tag [tag_name] [commit_id] -m [message]
说明:

5. 查看标签

git tag 查看标签列表 最上面是最早的标签版本
git show [tag_name] 查看

6. 去往某个标签节点

git reset —hard [tag_name]

7. 删除标签

git tag -d [tag_name]

版本命名规则

我们常见的版本命名格式为
[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. < 1.2.3 小于1.2.3 的版本均可
  2. = 1.2.3 只支持等于1.2.3 的版本
  3. <= 1.2.3 只支持小于等于1.2.3 的版本
  4. > 1.2.3 只支持大于 1.2.3 的版本
  5. >= 1.2.3 只支持大于等于 1.2.3 的版本
  6. 1.2.3-2 支持 >=1.2.3 <3.0.0 的版本
  7. 1.x.1 支持 >=1.0.1 <1.1.0 的版本
  8. * 支持 >= 0.0.0 的版本
  9. "" *
  10. 1 表示 >=1.0.0 <2.0.0 其余任意位置为空相似
  11. 1.0 >= 1.0.0 < 1.1.0
  12. ~1.1.1 >=1.1.1 <1.2.0
  13. ~1.1 >=1.1.0 <1.2.0
  14. ~1 >=1.0.0 <2.0.0
  15. ^1.1.1 >=1.1.1 <2.0.0
  16. ^0.1.1 >=0.1.1 <0.2.0 注意这里,不要以为是 0.1.1-1.0.0 之间
  17. ^0.0.1 >=0.0.1 <0.0.2 同上,请注意

注意大部分包管理工具均遵守上述规则,但是在进行版本限定时,请参考包管理工具的配置项说明,确定语法格式.

总结

最常用的知识

核心命名规则

  • 版本号通常称为 x.y.z

    • x 主版本号,一般向下不兼容时增加此值
    • y 次版本号,向下兼容,添加新特性时增加此值
    • z 补丁号,修复问题为改变特性时增加此值
    • a,b,rc 分别表示 内测,公测,发行状态

      版本限定

  • ~ 在依赖版本兼容下,最近的补丁版

  • ^ 在依赖版本兼容下,最近的次版本

重点是保证版本依赖的兼容性,不允许出现依赖的主版本号范围可变,即使你的开发包依旧可用

保存工作区

1. 保存工作区内容

git stash save [message]
说明:将工作区未提交的修改封存,让工作区回到修改前的状态

2. 查看工作区列表

git stash list
说明:最新保存的工作区在最上面

3. 使用某个工作区

git stash apply [stash@{n}]

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. 查看连接的主机

git remote

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 生成秘钥