Open evantianx opened 7 years ago
# -s 代表不显示提交信息而只显示提交量
# -n 代表用提交量排序而不是按照提交人 id 的首字母排序
# 注意: 这里的提交量为整个项目周期内所有的提交量
$ git shortlog -sn
the
-s
flag will suppress commit description and provide a commit count summary only. the-n
flag will sort output according to the number of commits per author instead of author alphabetic order.
当我们想比较确切时间范围内的提交量时,可以使用--since
和--until
:
$ git shortlog -sn --since="10 weeks" --until="2 weeks"
使用 git blame
可以轻易查找到某行代码的“责任人”
# 查找 _component.buttons.scss 文件中的 5 到 10 行代码是谁写的
$ git blame -L5,10 _components.buttons.scss
我们也可以将其改为称赞某人的功能:
$ git config --global alias.praise blame
这样就将 blame 改为 praise,看到好的代码不妨 git praise
下,当然最好是请他喝杯咖啡啦!☕️
当我们 diff 或者 show 一个文件时,会有很多空格修改的提示,对于寻找真正的目标造成了很大的干扰。
此时可以添加 -w
来避免。
$ git diff -w
$ git show -w
默认情况下, git diff
在某行修改时,会在原始行后显示被修改后的样子:
-My friend Tom recently gave an excellent talk
+My good friend Tom gave an excellent talk
我们如果只关注修改的单词字段,完全没有必要这样查看,加上 --word-diff
后:
My {+good+} friend Tom [-recently-] gave an excellent talk
可以方便地查看最近在哪些分支上工作过:
# --count=10 最近的10个分支
# --sort=-committerdate 按照提交时间排序
# refs/heads/ 只显示本地分支
# --format="%(refname:short)" 格式化
$ git for-each-ref --count=10 --sort=-committerdate refs/heads/ --format="%(refname:short)"
$ git checkout -
# 去掉行尾空白符
# 多个空行缩成一行
$ git stripspace < README.md
# 可以省略很多不必要的提示
$ git status -sb
该命令会在根目录下创建一个 .git
文件夹,用来存放关于 git 配置及版本历史相关信息。
该命令分两个步骤完成:
在 .git/objects
下创建一个 blob 文件
先将文件内容做哈希,然后取哈希值头两位作为该文件目录名字,其余作为 blob 文件名,并将该 blob 存放于该目录下。
例如, Git 将 a 哈希为 2e65efe2a145dda7ee51d1741299f848e5bf752e, 则存放该文件地址将为:
.git/object/2e/65efe2a145dda7ee51d1741299f848e5bf752e
将文件添加到 .git/index
下
.git/index
是一个列表,用来记录仓库需要维护的文件。
比如在 git add letter.txt
后,第一个步骤之后会将文件添加于 .git/index
之下:
data/letter.txt 2e65efe2a145dda7ee51d1741299f848e5bf752e
并将源文件指向 blob 文件
分三个步骤完成:
创建版本对应文件的 tree 对象
Git 通过 tree 图来记录项目当前状态
tree 图由 blob 对象和 tree 对象组成: 其中 blob 对象在执行 git add
时创建, 用来保存项目文件内容; tree 对象在执行 git commit
时创建, 一个 tree 对象对应工作区的一个目录。
tree 对象类似于:
# 分别对应 该文件权限 对象类型 哈希值 文件名
100664 blob 2e65efe2a145dda7ee51d1741299f848e5bf752e letter.txt
创建一个提交对象
之后会创建一个提交对象,位于 .git/objects/
下。
# 第一行指向一个 tree 对象,这里的哈希值对应工作区根目录的 tree 信息
tree ffe298c3ce8bb07326f888907996eaa48d266db4
author Mary Rose Cook <mary@maryrosecook.com> 1424798436 -0500
committer Mary Rose Cook <mary@maryrosecook.com> 1424798436 -0500
# 此处为提交信息
a1
将当前分支指向该提交对象
将当前分支指向新创建的 commit 对象
Git 将当前分支储存在 .git/HEAD
文件中,此时内容为: ref: refs/heads/master
,即 master 就是我们当前的分支。
如果是第一次提交,代表 master 引用的文件还不存在。不过 Git 会创建 .git/refs/heads/master
并写入提交对象的哈希值(包含了提交日期和作者信息)。
echo 'Hello, World!' | git hash-object --stdin
等价于:
echo 'blob 14\0Hello, World!' | openssl sha1
参考文章: