Git-基础

Travis 于 2020-03-23 发布

目录

Git 前言

Git 是什么?

1. 直接记录快照,而非差异比较

在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。 为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个快照流。

2. 近乎所有操作都是本地执行

Git 本地并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来。这样一来,在 Git 中的绝大多数操作都只需要访问本地文件和资源,极大提高了速度。

3. Git 保证完整性

Git 中所有的数据在存储前都计算校验和,然后以校验和来引用。

4. Git 一般只添加数据

你执行的 Git 操作,几乎只往 Git 数据库中 添加 数据。很难进行不可逆的操作,这样极大的保证了数据的安全性。

5. 三种状态

Git 中,你的文件可能存在下边三种状态

  • committed(已经安全保存到了本地数据库中)
  • modified(修改了,还未保存到数据库中)
  • staged(对已修改的文件做了标记,使之包含在下次提交的快照中)

与此对应 Git 项目的三个阶段:

  • 工作区
  • 暂存区
  • Git 目录

基本的工作流程:

  1. 在工作区修改了文件
  2. 将你想要下次提交的更改选择性的暂存
  3. 提交更新,找到暂存区的文件,永久存储到 Git 目录中

Git 初始配置

三个层级的 config 文件位置:

  1. 系统配置目下的 /etc/gitconfig
  2. 家目录下的 ~/.gitconfig~/.config/git/config
  3. Git项目下的 .git/config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看所有的配置以及它们所在的文件  
$ git config --list --show-origin  
  
# 配置用户名和邮件地址  
$ git config --global user.name "John Doe"  
$ git config --global user.email johndoe@example.com  
  
# 在不同的项目使用不同的用户名,在项目目录下使用  
$ git config user.name "John Doe"  
$ git config user.email johndoe@example.com  
  
# 配置文本编辑器  
$ git config --global core.editor emac  
  
# 检查配置  
$ git config --list  

Git 基础

获取仓库

两种方法:

1. 在已存在目录中初始化仓库

1
2
3
4
5
6
7
8
# 初始化目录  
$ cd /home/user/my_project  
$ git init  
  
# 若目录中已包含了文件  
$ git add *.c  
$ git add LICENSE  
$ git commit -m 'initial project version'  

2. 克隆现有的仓库

1
2
3
4
5
# 使用默认目录名  
$ git clone https://github.com/libgit2/libgit2  
  
# 自定义目录名  
$ git clone https://github.com/libgit2/libgit2 mylibgit2  

记录每次更新到仓库

1. 检查当前文件状态

1
2
3
4
5
# 详细查看  
$ git status  
  
# 简略查看  
$ git status -s  

2. 忽略文件
官方模板

1
2
3
4
# 创建 .gitignore 的文件  
$ cat .gitignore  
*.[oa]  
*~  

文件 .gitignore 的格式规范如下:
所有空行或者以 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
匹配模式可以以(/)开头防止递归。
匹配模式可以以(/)结尾指定目录。
要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。

3. 查看已暂存和未暂存的修改

1
2
3
4
5
6
7
8
9
# 比较的是工作目录中当前文件和暂存区域快照之间的差异  
$ git diff  
  
# 比对已暂存文件与最后一次提交的文件差异  
$ git diff --staged  
  
# 使用其他的 diff 工具  
$ git difftool --tool-help  
$ git difftool -t vimdiff  

4. 提交更新

1
2
$ git commit  
$ git commit -m 'xxx'  

4. 跳过使用暂存区域

1
2
# 自动把所有已经跟踪过的文件暂存起来一并提交  
$ git commit -a -m 'xxx'  

5. 移除文件

1
2
3
4
5
6
7
8
9
10
11
12
# 移除暂存区文件,同时删除本地磁盘上文件  
$ git rm xxx.md  
  
# 已存在暂存区的文件,同时手动在磁盘上删除了文件  
$ git rm -f xxx.md  
  
# 移除暂存区,不删除磁盘上的文件  
$ git rm --cached README  
  
# 支持 glob 模式,  
# 反斜杠,Git 有自己的扩展匹配方式,故不转义 shell 的匹配方式  
$ git rm log/\*.log  

5. 移动文件

1
2
3
4
5
6
$ git mv README.md README  
  
# 等价于下边三条命令  
$ mv README.md README  
$ git rm README.md  
$ git add README  

查看提交历史

1
2
3
4
5
6
7
8
9
10
11
12
# 不传参数  
$ git log  
  
# 按提交差异(补丁)输出 2 项  
$ git log -p -2  
  
# 基础信息外,要查看简略信息  
$ git log --stat  
  
# 格式输出(oneline、short、full、fuller、format)  
$ git log --pretty=oneline  
$ git log --pretty=format:"%h - %an, %ar : %s"  

git log –pretty=format 常用的选项

选项 说明
%H 提交的完整哈希值
%h 提交的简写哈希值
%T 树的完整哈希值
%t 树的简写哈希值
%P 父提交的完整哈希值
%p 父提交的简写哈希值
%an 作者名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 –date=选项 来定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期(距今多长时间)
%s 提交说明

git log 常用选项

选项 说明
-p 按补丁格式显示每个提交引入的差异。
–stat 显示每次提交的文件修改统计信息。
–shortstat 只显示 –stat 中最后的行数修改添加移除统计。
–name-only 仅在提交信息后显示已修改的文件清单。
–name-status 显示新增、修改、删除的文件清单。
–abbrev-commit 仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。
–relative-date 使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。
–graph 在日志旁以 ASCII 图形显示分支与合并历史。
–pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。
–oneline –pretty=oneline –abbrev-commit 合用的简写。

git log 限制输出

选项 说明
-<n> 仅显示最近的 n 条提交。
–since, –after 仅显示指定时间之后的提交。
–until, –before 仅显示指定时间之前的提交。
–author 仅显示作者匹配指定字符串的提交。
–committer 仅显示提交者匹配指定字符串的提交。
–grep 仅显示提交说明中包含指定字符串的提交。
-S 仅显示添加或删除内容匹配指定字符串的提交。

撤销操作

1. 重复提交

1
2
3
4
5
6
7
# 多次合并提交,在 log 里只显示一条提交  
$ git add test/test01.txt  
$ git commit -m 'add test01.txt'  
$ git add test/test02.txt  
$ git commit -amend -m 'add test01.txt test02.txt'  
$ git commit -amend -m 'add test01 test02'  
# 最后只会存在一次提交,添加了两个文件,注释是'add test01 test02’  

2. 取消暂存的文件

1
2
3
4
5
6
# 以下两种方法都可以(推荐第一种,语义更明确)  
# 现在版本的 git 推荐做法  
$ git add test/*  
$ git restore --staged test/test03.txt  
# 官方文档做法(可能是版本差异)  
$ git reset HEAD test/test02.txt  

3. 撤销对文件的修改

1
2
3
4
5
# 以下两种方法都可以(推荐第一种,语义更明确)  
# 现在版本的 git 推荐做法  
$ git restore test/test03.txt  
# 官方文档做法(可能是版本差异)  
$ git checkout -- test/test02.txt  

远程仓库的使用

1. 查看远程仓库

1
2
$ git remote  
$ git remote -v  

2. 添加远程仓库

1
2
3
# origin(默认) 代表整个 URL  
$ git remote add origin https://github.com/liuyuexizhi/test.git  
# git clone 默认使用 origin  

3. 从远程仓库中抓取与拉取

1
2
3
4
5
6
7
8
9
# 克隆  
$ git clone  
  
# 拉取(本地没有远程仓库有的数据)  
$ git fetch origin  
$ git fetch --all  
  
# 抓取数据并自动尝试合并到当前分支  
$ git pull origin  

4. 推送到远程仓库

1
2
# 推送到 origin 地址的 master 分支  
$ git push origin master  

5. 查看某个远程仓库

1
$ git remote show origin  

6. 重命名/移除远程仓库

1
2
3
4
5
# 重命名  
$ git remote rename origin dev-test  
  
# 移除  
$ git remote rm dev-test  

打标签

作用:
给历史仓库的某一次提交打上标签,一般用来标记发布版本号。

1. 列出标签

1
2
3
4
5
# 列出所有  
$ git tag  
  
# 匹配列出  
$ git tag -l 'v1.8.5*'  

2. 创建标签

2-1. 附注标签

1
$ git tag -a v1.4 -m "my version 1.4"  

2-2. 轻量标签

1
$ git tag v1.4-lw  

3. 后期打标签

1
2
3
# 末尾加上校验和(部分或全部)  
# 校验和通过 git log 查看  
$ git tag -a v1.2 9fceb02  

4. 共享标签
命令 git push 不会上传标签到远程仓库,需要显示地推送标签

1
2
3
4
5
# 推送单个标签  
$ git push origin v1.5  
  
# 推送所有不在远程端的标签  
$ git push origin --tags  

5. 删除标签

1
2
3
4
# 本地仓库删除标签  
$ git tag -d v1.4-lw  
# 远程仓库删除标签  
$ git push origin --delete v1.4-lw  

6. 检出标签

1
2
# 创建一个新分支,来检出 v2.0.0 版本  
$ git checkout -b version2 v2.0.0  

命令别名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 设置别名  
$ git config --global alias.ci commit  
  
# 即下边两条等价  
$ git ci  
$ git commit  
  
# 删除单个别名  
$ git config --global --unset alias.ci  
  
# 删除所有别名  
$ git config --global --remove-section alias  
  
# 另外 .gitconfig 文件也可以配置