昨天介绍了如何使用Git
中git add
和git commit
命令提交文件修改至暂存区和版本库。今天将介绍关于提交历史的相关操作以及如何为Git
命令设置别名。
3 查看提交的历史
笔者前段时间fork
了vue3
的源代码,这次将它本章节的Git
项目,来演示如何查看Git
的提交历史。
Git
中查看提交历史的命令是git log
,在源代码根目录下执行下该命令,看看会得到什么(提交信息太多了,这里只截取了前2条记录)。
$ git log
commit 310cb8cfab7596edd7185f0957e43dd0e797cee5 (HEAD -> master, origin/master, origin/HEAD)
Author: Evan You <yyx990803@gmail.com>
Date: Mon Jan 18 14:51:41 2021 -0500
chore: fix useSSRContext casing in warning message
commit 4fecb27f8696fdb8f681948543ea81ea62fe43bf
Author: Guillaume Chau <guillaume.b.chau@gmail.com>
Date: Fri Jan 29 16:48:37 2021 +0100
fix(devtools): send instance to devtools when it's mounted instead of created
从上面的输出中,可以了解git log
输出的几个信息:
git log
会默认以时间倒序的方式列出仓库中的所有提交- 每个提交都会显示该提交对应的
SHA-1
校验和、提交者的名称和邮箱、提交日期以及对应的描述信息
git log
支持很多个参数,用来定制输出内容,常用的有:
3.1 限定显示的提交条数
使用git log -<n>
命令可以只显示前n
条提交记录,例如:
$ git log -1
commit 310cb8cfab7596edd7185f0957e43dd0e797cee5 (HEAD -> master, origin/master, origin/HEAD)
Author: Evan You <yyx990803@gmail.com>
Date: Mon Jan 18 14:51:41 2021 -0500
chore: fix useSSRContext casing in warning message
3.2 显示每次提交的差异
使用git log -p
命令可以列出每次提交的差异内容,例如,看一下Evan You
最近一次提交更改了哪些内容:
$ git log -p -1
commit 310cb8cfab7596edd7185f0957e43dd0e797cee5 (HEAD -> master, origin/master, origin/HEAD)
Author: Evan You <yyx990803@gmail.com>
Date: Mon Jan 18 14:51:41 2021 -0500
chore: fix useSSRContext casing in warning message
diff --git a/packages/runtime-core/src/helpers/useSsrContext.ts b/packages/runtime-core/src/helpers/useSsrContext.ts
index a83f4c10..5b75b6f8 100644
--- a/packages/runtime-core/src/helpers/useSsrContext.ts
+++ b/packages/runtime-core/src/helpers/useSsrContext.ts
@@ -9,11 +9,11 @@ export const useSSRContext = <T = Record<string, any>>() => {
if (!ctx) {
warn(
`Server rendering context not provided. Make sure to only call ` +
- `useSsrContext() conditionally in the server build.`
+ `useSSRContext() conditionally in the server build.`
)
}
return ctx
} else if (__DEV__) {
- warn(`useSsrContext() is not supported in the global build.`)
+ warn(`useSSRContext() is not supported in the global build.`)
}
}
可以看到输出内容中增加了类似git diff
命令的输出内容,列出了该次提交的修改的内容。这对于代码审查或者浏览某个项目提交者提交的内容时会非常有用。
3.3 查看提交的摘要信息
Git
提供了git log --stat
命令查看提交的摘要信息,例如:
$ git log --stat -1
commit 310cb8cfab7596edd7185f0957e43dd0e797cee5 (HEAD -> master, origin/master, origin/HEAD)
Author: Evan You <yyx990803@gmail.com>
Date: Mon Jan 18 14:51:41 2021 -0500
chore: fix useSSRContext casing in warning message
packages/runtime-core/src/helpers/useSsrContext.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
和3.2章节的输出对比一下,这里是输出了差异的摘要信息,包括列出了修改的文件、修改文件的个数、增加了几条数据和删除了几条数据。
3.4 改变输出内容的显示格式
使用--pretty
选项可以修改git log
输出内容的显示格式。Git
中预定了一些格式,通过设置--pretty=<value>
的值来格式化git log
的输出。
oneline
:每行显示一个提交信息
$ git log --pretty=oneline -5
310cb8cfab7596edd7185f0957e43dd0e797cee5 (HEAD -> master, origin/master, origin/HEAD) chore: fix useSSRContext casing in warning message
4fecb27f8696fdb8f681948543ea81ea62fe43bf fix(devtools): send instance to devtools when it's mounted instead of created
d224753ff6ca07188aaf353be4e36e948c6b0a39 build(deps-dev): bump rollup from 2.38.0 to 2.38.1 (#3120)
7f086369003b50101849f4bcb8dd2978c1ea87ff build(deps-dev): bump @typescript-eslint/parser from 4.14.0 to 4.14.1 (#3098)
4d1bc8b800b5db00b780012e5df815eb6e52a496 build(deps-dev): bump rollup from 2.37.1 to 2.38.0 (#3093)
short
:输出提交的简略信息,省略了提交的日期,只留下提交的校验和、提交作者和邮箱以及提交描述信息
$ git log --pretty=short -2
commit 310cb8cfab7596edd7185f0957e43dd0e797cee5 (HEAD -> master, origin/master, origin/HEAD)
Author: Evan You <yyx990803@gmail.com>
chore: fix useSSRContext casing in warning message
commit 4fecb27f8696fdb8f681948543ea81ea62fe43bf
Author: Guillaume Chau <guillaume.b.chau@gmail.com>
fix(devtools): send instance to devtools when it's mounted instead of created
full
:在git log
的基础上增加了Commit
信息
$ git log --pretty=full -2
commit 310cb8cfab7596edd7185f0957e43dd0e797cee5 (HEAD -> master, origin/master, origin/HEAD)
Author: Evan You <yyx990803@gmail.com>
Commit: Evan You <yyx990803@gmail.com>
chore: fix useSSRContext casing in warning message
commit 4fecb27f8696fdb8f681948543ea81ea62fe43bf
Author: Guillaume Chau <guillaume.b.chau@gmail.com>
Commit: Guillaume Chau <guillaume.b.chau@gmail.com>
fix(devtools): send instance to devtools when it's mounted instead of created
fuller
:在git log
的基础上增加了Commit
、CommitDate
和AuthorDate
信息,但省略了Date
信息,AuthorDate
的值和Date
的值一致
$ git log --pretty=fuller -1
commit 310cb8cfab7596edd7185f0957e43dd0e797cee5 (HEAD -> master, origin/master, origin/HEAD)
Author: Evan You <yyx990803@gmail.com>
AuthorDate: Mon Jan 18 14:51:41 2021 -0500
Commit: Evan You <yyx990803@gmail.com>
CommitDate: Fri Jan 29 15:03:52 2021 -0500
chore: fix useSSRContext casing in warning message
format
:可以定制自己的喜欢的输出格式,format``常用的格式选项有:
格式选项 | 输出结果描述 |
---|---|
%H | 提交对象的散列值,即:校验和 |
%h | 提交对象的简短的散列值 |
%T | 树对象的散列值 |
%t | 树对象的简短的散列值 |
%P | 父对象的散列值 |
%p | 父对象的简短的散列值 |
%an | 作者的名称 |
%ae | 作者的邮箱 |
%ad | 创作的日期,可使用-data=<选用指定日期格式> |
%ar | 相当于当前日期的创作日期 |
%cn | 提交者的名称 |
%ce | 提交者的邮箱 |
%cd | 提交日期 |
%cr | 相当于当前日期的提交日期 |
%s | 提交信息的主题(相当于提交时附加的内容) |
$ git pretty --pretty=format:"%h - %cd: %cn, %s" --date=short -1
310cb8cf - 2021-01-29: Evan You, chore: fix useSSRContext casing in warning message
**注:**这里提到的提交者和创建者的区别将在后续的内容中介绍
3.5 显示简单的图表
将--pretty=oneline
或--pretty=format
和--graph
命令结合使用,可以用简单的图表方式展示Git
的提交历史,例如:
$ git log --pretty=oneline --graph
* 0e25143 (HEAD, master) Merge branch 'feature'
|\
| * 16b36c6 Fix a bug in the new feature
| * 23ad9ad Start a new feature
* | ad8621a Fix a critical security issue
|/
* 400e4b7 Fix typos in the documentation
* 160e224 Add the initial code base
3.6 限制提交列表输出的范围
Git
也提供了用于显示指定范围内的提交列表,前面小节中使用到的-<n>
是一种,它只展示最新的n
条提交,Git
也提供了其他的选项
3.6.1 按时间过滤
since
和until
可以按时间执行输出范围。
$ git log --since=2.weeks -1
commit 310cb8cfab7596edd7185f0957e43dd0e797cee5 (HEAD -> master, origin/master, origin/HEAD)
Author: Evan You <yyx990803@gmail.com>
Date: Mon Jan 18 14:51:41 2021 -0500
chore: fix useSSRContext casing in warning message
上述命令将输出最近两周内的最新的一次提交。
$ git log --until=2021-01-20 -1
commit e79feb0aa02c6d506f52849101e66948bcd450af
Author: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Wed Jan 20 07:03:33 2021 +0000
build(deps-dev): bump sass from 1.32.4 to 1.32.5 (#3064)
上述命令将输出截止到2021年1月20日最新的一次提交。
3.6.2 按作者者过滤
使用选项--author
可以过滤指定作者的提交信息。
$ git log --author="Evan You" -1
Author: Evan You <yyx990803@gmail.com>
Date: Mon Jan 18 14:51:41 2021 -0500
chore: fix useSSRContext casing in warning message
3.6.3 按提交信息的关键字过滤
使用选项--grep
可以选择中提交信息包含指定关键字的提交内容
$ git log --grep="chore" -1
Author: Evan You <yyx990803@gmail.com>
Date: Mon Jan 18 14:51:41 2021 -0500
chore: fix useSSRContext casing in warning message
这里需要注意的是,如果--author
和--grep
同时出现时,如果想要满足这两个条件,需要提供--all-match
选项,否则会返回符合任意一个条件的提交
3.6.4 按照文件命令过滤
如果指定了一个目录名或者文件名,就可以只输出更改了指定文件的提交内容。这个选项常常最后一个过滤命令出现,通常是要在目录名或者文件名之前添加--
,来将路径和其他选项分开
$ git log --until="2020-12-31" -1 -- README.md
commit db6c2df24b8ba8117db0102fa186b2d3f7b10b57
Author: Evan You <yyx990803@gmail.com>
Date: Mon Oct 5 12:02:01 2020 -0400
chore(readme): update eslint-plugin-vue status [ci skip]
3.6.5 其他过滤条件
选项 | 描述 |
---|---|
--since 、--after | 只输出指定日期之后的提交 |
--until 、--before | 只输出指定日期之前的提交 |
--author | 只输出作者与指定字符串匹配的提交 |
--commiter | 只输出提交者与指定字符串匹配的提交 |
--grep | 只输出提交信息中包含指定字符串的提交 |
-S | 只输出包含“添加或删除指定字符串”的更改的提交 |
-<n>n | 只输出最新的n 条提交内容 |
3.7 其他git log选项
选项 | 描述 |
---|---|
-g | 按补丁格式显示每个提交引入的更改 |
--shortstat | 只显示--stat 输出中包含“已更改/已删除”行的统计信息 |
--name-only | 在每个提交信息后,显示被更改的文件列表 |
--name-status | 在--name-only 输出的基础上输出“已更改/已删除”的统计信息 |
--abbrev-commit | 只显示完整的SHA-1 校验和和字符串中的前几个字符 |
--relative-date | 显示相对日期(比如:1个月前),而不是完整日期 |
$ git log --shorstat -1
commit 310cb8cfab7596edd7185f0957e43dd0e797cee5 (HEAD -> master, origin/master, origin/HEAD)
Author: Evan You <yyx990803@gmail.com>
Date: Mon Jan 18 14:51:41 2021 -0500
chore: fix useSSRContext casing in warning message
1 file changed, 2 insertions(+), 2 deletions(-)
$ git log --name-only -1
commit 310cb8cfab7596edd7185f0957e43dd0e797cee5 (HEAD -> master, origin/master, origin/HEAD)
Author: Evan You <yyx990803@gmail.com>
Date: Mon Jan 18 14:51:41 2021 -0500
chore: fix useSSRContext casing in warning message
packages/runtime-core/src/helpers/useSsrContext.ts
$ git log --name-status -1
commit 310cb8cfab7596edd7185f0957e43dd0e797cee5 (HEAD -> master, origin/master, origin/HEAD)
Author: Evan You <yyx990803@gmail.com>
Date: Mon Jan 18 14:51:41 2021 -0500
chore: fix useSSRContext casing in warning message
M packages/runtime-core/src/helpers/useSsrContext.ts
$ git log --relative-date -1
commit 310cb8cfab7596edd7185f0957e43dd0e797cee5 (HEAD -> master, origin/master, origin/HEAD)
Author: Evan You <yyx990803@gmail.com>
Date: 2 weeks ago
chore: fix useSSRContext casing in warning message
4 撤销操作
Git
支持几种撤销操作的方式,包括:撤销对文件的修改、从暂存区中撤销
4.1 撤销对文件的修改
可以通过命令git checkout -- <file>
完全的撤销对文件的修改,该命令将会使用上一次版本中的文件覆盖,如果该文件处于暂存状态,会使用暂存区的文件替换,否者会使用上一次提交时的文件替换。
如果只需要暂时隐藏对于文件的修改,完成紧急任务后再恢复现有的修改,可使用命令git stash
将修改的内容保存起来。
4.2 撤销暂存
可以使用git rest HEAD <file>
将文件移除暂存区
4.3 撤销上次的提交
在工作中你有没有到这种情况呢:提交更改后发现写错了提交信息或者提交时少提交了一个文件需要补上。这种可以使用git commit --amend
尝试重新提交
git commit --amend
会提交暂存区的内容,如果提交后没有任何修改,执行该命令可以修改提交信息,并且提交的快照不会有任何变化
如果上次提交了忘记提交某个文件,可以使用如下流程:
$ git add <file>
$ git commit --amend
上述流程因为会覆盖上一个提交的内容,因此两次提交操作实质上只会提交一次内容
5 标记Git
给Git
打标记,也可称为为Git
添加tag
(标签)。在项目进行后某个阶段时,可以将当前版本指定为重要版本。
5.1 创建标签
Git
中的标签分为:轻量标签和注释标签。
轻量标签很像一个不可变的分支,只是一个指向某次提交的指针。如果需要只创建一个临时的标签,又或者就是不需要提供其他信息,可以使用轻量标签。
$ git tag v1.0-alpha
注释标签则会作为完整的对象存储在Git
数据库中。注释标签的内容包括了校验和、标记者的名称、邮箱、创建时间、标记时提供的信息。
$ git tag -a v1.0 -m "1.0版本"
其中,-m
指定标记信息,-a
指定标签名称
5.2 列举标签
使用git tag
命令可以查看项目中所有的标签,输出结果按字母顺序排序。
$ git tag
v1.0
v1.0-alpha
git tag
的-l
选项支持按照某个特定匹配模式过滤标签列表
$ git tag -l "v1.0-a*"
v1.0-alpha
5.3 查看指定TAG的描述信息
使用命令git show <tag_name>
查看指定TAG
的描述信息,这里分别看一下注释标签和轻量标签的内容。
$ git show v1.0
tag v1.0
Tagger: jiaoxiangning <2438822080@qq.com>
Date: Wed Feb 3 23:02:39 2021 +0800
<E7><89><88><E6><9C><AC>1.0
commit 04ca43e116cd379eb12b2ce7929ea4b9fca50cba (HEAD -> master, tag: v1.0-alpha, tag: v1.0)
Author: jiaoxiangning <2438822080@qq.com>
Date: Wed Feb 3 22:46:45 2021 +0800
20210203<E6><8F><90><E4><BA><A4>
diff --git a/bb.txt b/bb.txt
index e61ef7b..8a72671 100644
--- a/bb.txt
+++ b/bb.txt
@@ -1 +1,4 @@
+iii
+C
+C
aa
diff --git a/aa.txt b/cc.txt
similarity index 100%
rename from aa.txt
rename to cc.txt
$ git shwo v1.0-alpha
commit 60f3f68adb617ce45de5225ce93b23615913bffb (HEAD -> master, tag: v1.1-alpha)
Author: jiaoxiangning <2438822080@qq.com>
Date: Wed Feb 3 23:08:48 2021 +0800
version
diff --git a/version.txt b/version.txt
new file mode 100644
index 0000000..088eda4
--- /dev/null
+++ b/version.txt
@@ -0,0 +1 @@
+version
对比上面两个输出结果,轻量标签的输出结果只包含提交的相关信息,不包含标签的任何信息
5.4 追加标签
上面的示例添加标签时,默认是在最新的提交内容上创建标签,当然也可以在之前的提交内容的基础上添加标签,命令为git tag -a v0.9 -m "0.9版本" <提交的ID>
5.5 推送标签
在执行git push
时并不会将提交关联的标签推送到服务器上,需要明确的指出将标签推送到远端仓库,命令为git push <远程仓库名称> <tagname>
,远程仓库相关知识将在明天的分享中介绍,这里只需要先有个印象就可以了。
如果一次提交多个标签,可使用命令git push <远程仓库名称> --tags
。
6 Git别名
Git
别名类似为Git
中的命令设置一个绰号,可以通过git config
来实现,例如:
$ git config --global alias.ci commit
上面的命令执行效果是,用ci
代替commit
,也就是说git ci -m
和git commit -m
是等价的。
可以为常用的一些组合命令设置别名,让Git
操作变的更加方便,例如:
$ git commit --global alias.last 'log -1'
这样执行git last
命令将会获取最新的一次提交
$ git config --global alias.unstage 'reset HEAD --'
这样执行git unstage <filename>
会将指定的文件从暂存区中移除