Git快速入门1
本文中不介绍如何在各大平台上安装Git工具,直接讲解Git中的术语和命令的使用
-
Git
术语 - 命令使用
笔者曾经写过Git使用,里面有介绍如何在win10
上安装Git
以及简单的介绍了Git
的几个常用命令。
Git术语
- 版本库
Git
的版本库repository
不仅仅是一个简单的数据库,它不仅提供版本库中所有文件的完整副本,还提供版本库本身的副本。Git
维护两个主要的数据结构
- 对象库
object store
- 索引
index
- Git对象类型
- 块
blob
文件的版本叫做一个块,二进制大对象简称binary large object
- 目录树tree
一个目录树对象代表一层目录信息,包含:blob标识符、路径名和文件里面的元数据。用来跟踪文件的路径名。
git write-tree # 查看散列值
- 提交commit
一个提交对象保存版本库中每个变化的元数据,包含作者、提交者、提交日期和日志消息等。每个提交对象指向一个目录树对象
- 标签
tag
一个标签对象分配给一个任意的且人类可读的名字给一个特定对象,通常是一个提交对象。分为两种标签:轻量级的(lightweight)
和带附注的(annotated)
。Git
命令只对带标注的标签起作用。
git tag -m "tag version 1.0" V1.0 3d837438 # 创建带有提交信息和附注的标签
git rev-parse V1.0 # 查看散列值
git cat-file -p 6b82883 # 查看文件信息
- 索引
索引是一个临时的、动态的二进制文件,它描述整个版本库的目录结构。Git
的索引中不包含任何内容。Git
会通过索引而不是工作目录来找到提交的内容。
git status # 查看索引状态
git ls-files --stage # 查看SHA1值
- 可寻址变更内容
Git
对象库被组织及实现成一个内容寻址的存储系统。
对象库中的每个对象都有一个唯一的名称,这个对象是用SHA1
算法得到的SHA1
散列值。该值是一个160
位的数,通常表示为一个40
位的十六进制数。
文件的SHA1
(散列ID、对象ID)是一种有效的全局唯一标识符
git rev-parse 3b183a430 # 通过前几位散列值查看40个字符
- 对象库图示
- blob对象是数据库的底端,只被树对象引用:矩形
- 树对象指向若干blob对象或者树对象:三角形
- 每个提交对象指向一个特定的树对象,一个圆圈表示一个提交对象:圆形
- 提交文件涉及到分支:圆角矩形
- 每个标签可以指向最多指向一个提交对象:平行四边形
Git文件分类
Git
中的文件分为3
类:
- 已追踪的
Tracked
指的是已经在版本库中文件,或者是已暂存到索引中的文件,通过git add filename
进行追踪。
-
被忽略的
Ignored
-
未追踪的
Untracked
如果想忽略某个文件,将该文件加入到.gitignore
中
echo main.o > .gitinnore
Git命令行
1、基本命令
1、git
安装好Git
之后,直接输入git
,显示最常用的选项和子命令
2、git help -all
查看某个子命令
3、git —version
查看git
版本的版本信息
2、快速入门
假设在目录~/bigdata下面
mkdir ~/bigdata
cd ~/bigdata
echo 'bigdata is so popular' > test.txt
- 此时文件仍在版本库中
-
Git
只是缓存了这个文件test.txt
4、git init
初始化操作 ,将目录转成一个新的Git
版本库
5、git add .
最后面是英文的点,.
是当前目录的简写,指的是添加目录中的全部文件
6、git add >filename>
添加某个具体的文件。git add
命令是将文件暂存。从未追踪变成已追踪的。暂存文件也称之为缓存一个文件,或者把文件放进索引。
7、git status
显示文件的中间状态,命令表示将在下一次提交的时候添加到版本库中
8、git commit
- 提交命令,可以带上参数
-m
;加上个人信息
git commit -m "first commit" --author="peter <123456@qq.com>"
设置GIT_EDITOR
的环境变量
vim /etc/profile
export GIT_EDITOR=vim
3、配置提交作者
利用git config
命令进行设置
git config user.name "peter"
git config user.email "123456@qq.com"
4、查看提交
通过git log
进行查看
- 条目显示内容从最近开始
- 每个条目包含名字、邮箱、地址、日期和提交的内部识别码ID
git log
git log mydata # 假设data改成了mydata,查看mydata的新消息
git log --follow mydata # 查看整个历史记录
git show id号 # 查看某个具体的提交
git show # 显示最近的一次
git show-branch --more=10 # 查看当前分支的10个提交版本
5、查看提交差异
通过git diff
命令
- <id_old> 前面会带上--
- <id_new> 前面带上++
git diff <id_old> <id_new>
6、删除和重命名
假设现在~/bigdata
有两个文件:index.html
和test.html
- 删除一个文件
git rm index.html # 删除之后还要提交信息
git commit -m "remove file index.html"
- 重命名文件
# 1
mv index.html indexnew.html # 先复制拷贝一份,防止git rm永久删除文件
git rm index.html # 删除之后再添加
git add indexnew.html
# 2
git mv index.html indexnew.html
# 暂存的变更必须进行提交
git commit -m "move file index.html"
创建版本副本
git clone old_rep new_rep # 创建副本
# 查看两个版本的区别
ls -las old_rep new_rep
diff -r old_rep new_rep
Git配置文件
1、配置和移除设置
Git
的配置文件都是.ini
的文本文件,Git
中有多种配置文件
-
.git/config
版本库特定的配置设置,默认选项,
—file
选项修改,优先级最高 -
~/.gitconfig
用户特定的配置设置,
—global
修改 -
/etc/gitconfig
优先级最低,可能不存在,可能在
/usr/local/etc/gitconfig
# 控制所有的版本库
git config --global user.name "John"
git config --global user.email "123456@qq.com"
# 针对特点的版本库
git config user.name "John"
git config user.email "123456@qq.com"
# 移除设置
git config --unset --global user.email
2、别名设置
- 修改一条命令:将
push origin master
设置成psm
git config --global alias.psm "push origin master"
- 配置文件中批量修改:
vim .gitconfig
[user]
name = peter
email = 123456@qq.com
# 添加如下内容
[alias]
co = checkout
ci = commit
st = status
psm = push origin master\n
last = log -l HEAD
M2oAH0.png
提交commit
绝对和相对提交
在Git
中,提交是用来记录版本库的变更的。
- 显式引用:
40
位16
进制的SHA1
提交ID
- 隐式引用:始终指向最新提交的
HEAD
- 绝对提交名
散列ID
是唯一值,它能表示唯一确定的一个提交。
git log -1 --pretty=oneline HEAD # 显示散列值
git log -1 --pretty=online 1ffb58 # 1ffb58是散列值的前6位
- 相对提交名
-
master
:分支的头 -
master^
:master
分支中的倒数第二个分支
- 关于
^
和~
的区别
^
:表示父级提交,并行关系
~
:依次表示父级、祖父级、曾祖父级提交,串行关系
git show-branch --more=35 | tail 10 # 限制输出最后10行提交记录
git rev-parse master~3^2^2^ # 查看该分支的散列值ID
提交图
Git
使用的有向无环图DAG
进行提交
- 有向:图中的每条边都从一个节点指向另一个节点
- 无环:节点沿着有向边走,不存在回到起始点的路径
对于上图的解释:
- 时间轴是从左到右
-
A
是初始提交,没有父级提交 -
B
是A
的子提交 -
C
和E
是B
的子提交,它们俩无法确定前后 -
H
是一个合并提交(merge commit)
,拥有多个父级提交 - 关于“有首无尾”:比如从
B~D
的提交,指的是C
和D
,不包含B
查找提交
- 查找提交使用的工具是
git bisect
,方法使用的二分查找法
git bisect start # 启动查找
git bisect bad
git bisect good
git bisect log # 查看日志
git bisect replay # 重新查找
- 使用
git blame
该命令可以显示文件中每行最后是谁做的修改和哪次提交做了变更
git blame -L 35, init/version.c
分支
原因
使用分支的原因:
- 一个分支通常代表一个单独的刻画发布版
- 一个分支可以封装一个开发阶段
- 一个分支可以隔离一个特性的开发
- 每个分支可以代表单个贡献者的工作
分支的分类:
- 特性分支
topic branch
- 开发分支
development branch
- 追踪分支
tracking branch
命名规则
- 使用斜线创建一个分层的命名方案,但是分支名不能够以斜线
/
结尾 - 分支名不能以减号-开头
- 分支名的任何地方不能含有两个点
- 不能有空格和空白字符
- 不能含有
Git
中具有特殊含义的字符,如波浪线、冒号、问号、星号等
创建
使用的命令是git branch <branchname>
git branch test # 创建分支
查看
git branch # 查看分支
git show-branch # 结果更详细
git show-branch bug/pr-1 bug/pr-2 # 查看两个分支的提交记录
git show-branch bug/* # 支持通配符
删除
# 方式1
git branch -D bug/pr-1 # 删除分支
# 方式2
git merge bug/pr-1 # 先合并到主分支
git branch -d bug/pr-1 # 再进行删除,参数是d
切换
git checkout test # 切换分支
git checkout -b bug/pr-1 # 创建分支同时进行切换