◆

Git log 查看提交历史与分支合并图详解

2023-02-02 01:370

git log 是我们了解一个仓库发生过什么的主要入口。它默认输出很啰嗦,一个提交占四五行,翻几屏就晕,所以实际使用中真正有用的是那些格式化参数——把输出压成一行、画出分支合并图、按作者或时间筛选。

这篇把我平时最常用的几条记下来,配上实际输出的截图,重点说清每种输出该看哪里。另外顺带区分一个容易混的命令:git log 看的是提交历史,git reflog 看的是本地 HEAD 的移动记录,两者用途差别很大。

查看历史记录 git log

  • git log 命令显示从最近到最远的提交日志 git log 默认输出,包含完整 commit hash、作者、日期和提交说明

这张图是默认输出的样子。每条提交由四部分组成:commit 后面那串 40 位十六进制是完整的 SHA-1 哈希,是这个提交在整个仓库里的唯一标识;Author 是提交者的姓名和邮箱,来自 user.name 和 user.email 配置;Date 是提交时间;最后缩进的那段是提交说明。排序是从最新往下到最旧,也就是我们看到的第一条是当前分支的最新提交。

输出超过一屏时会进入分页器,用方向键或空格翻页,按 q 退出。

  • git log -1 最近一次提交

  • git log -2 最近两次提交

-n 这个参数在写脚本或者只想确认"最后一次改了什么"的时候特别顺手,配合 -p 还能直接看到那次提交的具体 diff:

git log -1 -p
  • 精简输出信息 --pretty=oneline 参数
git log --pretty=oneline
git log --pretty=oneline 的输出,每个提交压缩为一行

这张图能明显看出区别:每个提交压成了一行,格式是"完整哈希 + 空格 + 提交说明第一行",作者和日期都被省掉了。想快速扫一遍最近做过哪些改动时,这个视图效率最高。

哈希太长影响阅读的话用 --oneline,它会把哈希缩短到 7 位左右(git 保证在当前仓库内不重复),并且额外标出分支和标签的位置:

git log --oneline
  • 查看命令历史以及所对应的 hash 值
git reflog
git reflog 输出,显示 HEAD@{n} 引用与对应的操作类型

这张图和上面的 git log 长得像,但含义完全不同,要看的是每行中间的 HEAD@{0}、HEAD@{1} 这种编号,以及后面的操作类型(commit、checkout、reset、merge 等)。

git reflog 记录的不是提交历史,而是本地 HEAD 指针每一次移动的日志。它的价值在于救命:我们误执行了 git reset --hard 把提交搞丢了,git log 里已经找不到那个提交,但 reflog 里还在,用记下的哈希就能恢复回来:

git reset --hard <reflog 里记的哈希>

要注意 reflog 是纯本地的,不会推送也不会克隆,并且默认只保留 90 天(不可达的提交是 30 天),过期会被 gc 清掉。所以它只能救最近的失误。

上面这条 git reset --hard 本身会丢弃当前工作区和暂存区的所有未提交改动且不可恢复,执行前先用 git status 确认干净,或者先 git stash 一下。

  • 查看分支合并图
git log --graph --pretty=oneline --abbrev-commit
git log --graph 输出,左侧用字符画出分支的分叉与合并

这张图的重点在左侧那几列由 *、|、/、\ 组成的字符图形。* 是一个提交,竖线是分支的延续,斜线出现的地方就是分支分叉或者合并的位置。一个提交同时接两条线进来,说明它是 merge commit。

三个参数各管一件事:--graph 负责画左边的图,--pretty=oneline 把每个提交压成一行让图形不被文字撑散,--abbrev-commit 把哈希缩短。这条命令有点长,值得配个别名天天用:

git config --global alias.lg "log --graph --oneline --decorate --all"

之后敲 git lg 就行。多加的 --decorate 会在提交后面标出分支名和标签,--all 让所有分支都进图,这在排查"这个分支到底从哪里切出来的"时很关键——只看当前分支是看不出分叉点的。

其他常用筛选

按作者、时间、关键字过滤,排查问题时用得比想象中多:

# 只看某个人的提交
git log --author="wfly"

# 按时间范围
git log --since="2024-01-01" --until="2024-03-01"

# 按提交说明搜关键字
git log --grep="fix"

# 只看某个文件的变更历史
git log --oneline -- src/main.js

# 搜索"哪次提交增删了这段代码"
git log -S "someFunction"

最后那条 -S 叫 pickaxe,它匹配的不是提交说明,而是 diff 内容中某个字符串出现次数发生变化的提交。定位一行代码是什么时候被谁引入或删掉的,比翻 git log 快得多。

💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVEGit log 查看提交历史与分支合并图详解加载中