1. 简介

Git 提供了多种方式来查看仓库的当前和历史状态,这对于追踪版本变更、理解开发流程至关重要。其中最常用的子命令之一是 git log,它用于查看提交历史。而 git reflog 在某些场景下甚至比 log 更有用。

在本教程中,我们将探讨如何展示和定制 Git 日志以针对特定分支。首先简要回顾 Git 的结构和工作流,然后深入 logreflog 的使用。接着我们会查看所有分支的日志,再聚焦于如何查看特定分支的日志和 reflog。最后,我们介绍一种替代方法,用于分析仅属于某个分支的提交。

本教程中的代码测试环境为 Debian 12(Bookworm),使用 GNU Bash 5.2.15 和 Git 2.39.2。除非另有说明,这些命令应在大多数 POSIX 兼容环境中正常运行。

2. Git 的结构与工作流

Git 包含三种“树”结构:

  • 根提交树(commit tree)
  • 暂存树(staging tree)
  • 工作目录树(working directory tree)

典型的 Git 工作流程包括三个主要步骤:

  1. 在工作目录中进行修改
  2. 将部分或全部修改添加到暂存区
  3. 将暂存区的内容提交到根提交树

提交树是 Git 仓库中存储数据的核心结构。我们可以通过 checkoutrebase 等命令切换到不同的提交。这种切换通常会改变 HEAD 的指向,并更新工作目录的内容。

最常见的 HEAD 移动原因就是切换分支。但有时候我们并不只关心当前分支。

3. Git Log 与 Reflog

Git 仓库中的所有操作都会被记录,但并非所有操作都会出现在公共的 log 中,有些只记录在 reflog 中。

两者的主要区别在于可见性:

  • log 是公开的,所有有仓库访问权限的人都能看到
  • reflog 是本地的,只记录在本地仓库的操作,不同用户或不同克隆的仓库之间内容不同

另一个区别是内容范围:

  • log 只记录提交(commit)
  • reflog 记录所有操作,包括提交、切换分支、重置等

示例:git log 输出

$ git log
commit a89d48bea4444f80e2afc95c9c0ed2d703a2ebcd (HEAD -> master)
Author: x <[email protected]>
Date:   Wed Mar 13 09:19:10 2024 -0400

    new structure

commit 73fa11ebded1be52f00a4f4596000195db4e2d63
Author: x <[email protected]>
Date:   Wed Mar 13 08:08:16 2024 -0400

    wipeout

...

这是 Git 提交树中所有提交及其元数据的列表。

示例:git reflog 输出

$ git reflog
a89d48b (HEAD -> master) HEAD@{0}: commit: new structure
73fa11e HEAD@{1}: commit: wipeout
6332bd9 HEAD@{2}: commit: major modifications
e392676 HEAD@{3}: commit: minor modifications
2ccb08f HEAD@{4}: checkout: moving from branch1 to master
04ef448 (tag: v0.1, branch1) HEAD@{5}: commit: branch feature
...

默认输出更简洁,但 reflog 支持与 log 相同的格式化参数。可以看到,reflog 中记录了更多操作,比如切换分支、创建标签等。

✅ 总结:

  • log 只记录提交
  • reflog 记录所有 Git 操作,包括提交、切换分支、重置等

4. 查看所有分支的 (ref)log

默认情况下,git loggit reflog 都只显示当前分支的历史。如果我们想查看所有分支的历史,可以加上 --all 参数。

查看所有分支的 log

$ git log --all

这将显示所有分支上的提交历史。

查看所有分支的 reflog

$ git reflog --all

这将显示所有分支的操作记录,包括切换分支、提交等。

⚠️ 注意:reflog 是本地的,不是共享的,因此每个用户的 reflog 都可能不同。

5. 查看特定分支的 (ref)log

如果我们想查看某个非当前分支的提交历史或操作记录,只需在命令后加上分支名即可。

查看特定分支的 log

$ git log branch3

这将显示 branch3 分支上的所有提交记录。

查看特定分支的 reflog

$ git reflog branch3

这将显示 branch3 分支相关的操作记录,比如创建分支、提交等。

✅ 示例输出:

a583e9d (branch3) branch3@{0}: commit: experimental
37ec911 branch3@{1}: branch: Created from HEAD

⚠️ 注意:reflog 只记录该分支自身的操作,不会包含其父分支的历史。

6. 查看不属于主分支的提交

如果我们想查看某个分支独有的提交(即不在主分支上的提交),可以使用 git cherry 命令。

使用 cherry 命令

$ git checkout branch1
$ git cherry -v master
+ 37ec9115b08c6df4b5d1cef1d86aa2e7fc0df52b branch modifications
+ 04ef448b671b43cfae7688adcee5db1fdc0395b6 branch feature

这会列出 branch1 上存在但 master 上没有的提交。

✅ 用途:常用于代码评审、合并前检查,避免重复提交。

7. 总结

Git 提供了丰富的日志查看和分支分析功能,尤其在日志分析方面表现灵活:

  • git log 查看提交历史
  • git reflog 查看本地操作记录
  • --all 参数查看所有分支的日志
  • ✅ 指定分支名查看特定分支的 log/reflog
  • git cherry 查看某分支独有的提交

掌握这些命令可以帮助你更高效地理解 Git 仓库的结构和历史,避免踩坑。


原始标题:Git (Ref) Log Exploration and Branch Selection