Fork me on GitHub

Git入门-one

本文中不介绍如何在各大平台上安装Git工具,直接讲解Git中的术语和命令的使用

  • Git术语
  • 命令使用

Git术语

  1. 版本库

Git的版本库repository不仅仅是一个简单的数据库,它不仅提供版本库中所有文件的完整副本,还提供版本库本身的副本。Git维护两个主要的数据结构

  • 对象库object store
  • 索引index
  1. Git对象类型
  • 块blob

文件的版本叫做一个块,二进制大对象简称binary large object

  • 目录树tree

一个目录树对象代表一层目录信息,包含:blob标识符、路径名和文件里面的元数据。用来跟踪文件的路径名。

1
git write-tree   # 查看散列值
  • 提交commit

一个提交对象保存版本库中每个变化的元数据,包含作者、提交者、提交日期和日志消息等。每个提交对象指向一个目录树对象

  • 标签tag

一个标签对象分配给一个任意的且人类可读的名字给一个特定对象,通常是一个提交对象。分为两种标签:轻量级的(lightweight)和带附注的(annotated)。Git命令只对带标注的标签起作用。

1
2
3
git tag -m "tag version 1.0" V1.0 3d837438   # 创建带有提交信息和附注的标签
git rev-parse V1.0 # 查看散列值
git cat-file -p 6b82883 # 查看文件信息
  1. 索引

索引是一个临时的、动态的二进制文件,它描述整个版本库的目录结构。Git的索引中不包含任何内容。Git会通过索引而不是工作目录来找到提交的内容。

1
2
git status  # 查看索引状态
git ls-files --stage # 查看SHA1值
  1. 可寻址变更内容

Git对象库被组织及实现成一个内容寻址的存储系统。

对象库中的每个对象都有一个唯一的名称,这个对象是用SHA1算法得到的SHA1散列值。该值是一个160位的数,通常表示为一个40位的十六进制数。

文件的SHA1(散列ID、对象ID)是一种有效的全局唯一标识符

1
git rev-parse 3b183a430   # 通过前几位散列值查看40个字符
  1. 对象库图示
  • blob对象是数据库的底端,只被树对象引用:矩形
  • 树对象指向若干blob对象或者树对象:三角形
  • 每个提交对象指向一个特定的树对象,一个圆圈表示一个提交对象:圆形
  • 提交文件涉及到分支:圆角矩形
  • 每个标签可以指向最多指向一个提交对象:平行四边形

M2qw7R.png

M2qz40.png


Git文件分类

Git中的文件分为3类:

  1. 已追踪的Tracked

指的是已经在版本库中文件,或者是已暂存到索引中的文件,通过git add filename进行追踪。

  1. 被忽略的Ignored

  2. 未追踪的Untracked

如果想忽略某个文件,将该文件加入到.gitignore中

1
echo main.o > .gitinnore

Git命令行

1、基本命令

1、git

安装好Git之后,直接输入git,显示最常用的选项和子命令

2、git help -all

查看某个子命令

3、git —version

查看git版本


2、快速入门

假设在目录~/bigdata下面

1
2
3
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;加上个人信息
1
git commit -m "first commit" --author="peter <123456@qq.com>"
  • 设置GIT_EDITOR的环境变量
1
2
vim /etc/profile
export GIT_EDITOR=vim

3、配置提交作者

利用git config命令进行设置

1
2
git config user.name "peter"
git config user.email "756803877@qq.com"

4、查看提交

通过git log进行查看

  • 条目显示内容从最近开始
  • 每个条目包含名字、邮箱、地址、日期和提交的内部识别码ID
1
2
3
git log
git log mydata # 假设data改成了mydata,查看mydata的新消息
git log --follow mydata # 查看整个历史记录
1
2
3
git show id号   # 查看某个具体的提交
git show # 显示最近的一次
git show-branch --more=10 # 查看当前分支的10个提交版本

5、查看提交差异

通过git diff命令

  • <id_old> 前面会带上–
  • <id_new> 前面带上++
1
git diff <id_old> <id_new>

6、删除和重命名

假设现在~/bigdata有两个文件:index.htmltest.html

  • 删除一个文件
1
2
git rm index.html  # 删除之后还要提交信息
git commit -m "remove file index.html"
  • 重命名文件
1
2
3
4
5
6
7
8
9
10
# 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"

7、创建版本副本

1
2
3
4
5
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

1
2
3
4
5
6
7
8
9
10
# 控制所有的版本库
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
1
git config --global alias.psm "push origin master"
  • 配置文件中批量修改:
1
2
3
4
5
6
7
8
9
10
11
12
13
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
  1. 绝对提交名

散列ID是唯一值,它能表示唯一确定的一个提交。

1
2
git log -1 --pretty=oneline HEAD   # 显示散列值
git log -1 --pretty=online 1ffb58 # 1ffb58是散列值的前6位
  1. 相对提交名
  • master:分支的头
  • master^:master分支中的倒数第二个分支
  1. 关于^和~的区别

^:表示父级提交,并行关系

~:依次表示父级、祖父级、曾祖父级提交,串行关系

MRtALq.png

1
2
git show-branch --more=35 | tail 10   # 限制输出最后10行提交记录
git rev-parse master~3^2^2^ # 查看该分支的散列值ID

提交图

Git使用的有向无环图DAG进行提交

  • 有向:图中的每条边都从一个节点指向另一个节点
  • 无环:节点沿着有向边走,不存在回到起始点的路径

MRUbz4.png

MRUzo6.png

MRah1e.png

对于上图的解释:

  1. 时间轴是从左到右
  2. A是初始提交,没有父级提交
  3. B是A的子提交
  4. C和E是B的子提交,它们俩无法确定前后
  5. H是一个合并提交(merge commit),拥有多个父级提交
  6. 关于“有首无尾”:比如从B~D的提交,指的是C和D,不包含B

查找提交

  1. 查找提交使用的工具是git bisect,方法使用的二分查找法
1
2
3
4
5
6
git bisect start   # 启动查找
git bisect bad
git bisect good
git bisect log # 查看日志

git bisect replay # 重新查找
  1. 使用git blame

该命令可以显示文件中每行最后是谁做的修改和哪次提交做了变更

1
git blame -L 35, init/version.c

分支

原因

使用分支的原因:

  1. 一个分支通常代表一个单独的刻画发布版
  2. 一个分支可以封装一个开发阶段
  3. 一个分支可以隔离一个特性的开发
  4. 每个分支可以代表单个贡献者的工作

分支的分类:

  • 特性分支topic branch
  • 开发分支development branch
  • 追踪分支tracking branch

命名规则

  1. 使用斜线创建一个分层的命名方案,但是分支名不能够以斜线/结尾
  2. 分支名不能以减号-开头
  3. 分支名的任何地方不能含有两个点
  4. 不能有空格和空白字符
  5. 不能含有Git中具有特殊含义的字符,如波浪线、冒号、问号、星号等

创建

使用的命令是git branch <branchname>

1
git branch test  # 创建分支

查看

1
2
3
4
git branch  # 查看分支
git show-branch # 结果更详细
git show-branch bug/pr-1 bug/pr-2 # 查看两个分支的提交记录
git show-branch bug/* # 支持通配符

删除

1
2
3
4
5
6
# 方式1
git branch -D bug/pr-1 # 删除分支

# 方式2
git merge bug/pr-1 # 先合并到主分支
git branch -d bug/pr-1 # 再进行删除,参数是d

切换

1
2
git checkout test  # 切换分支
git checkout -b bug/pr-1 # 创建分支同时进行切换

本文标题:Git入门-one

发布时间:2019年11月20日 - 01:11

原始链接:http://www.renpeter.cn/2019/11/20/Git%E5%85%A5%E9%97%A81.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea