HOW - 查看分支创建时间(含 git reflog 和 git log 区别)
背景&问题
问题一:查看分支创建时间
有时候就是需要查看分支创建时间,可以通过 git reflog
。
问题二:提取分支指定变更
在 HOW - 基于master的a分支和基于a的b分支合流问题 中我们介绍过 “重建 b 分支(如果冲突过多,建议此方式)” 方案,里面就需要提取分支指定变更,将 b 的变更引入 b_new
。对于这个问题,我们就需要一种方法去获取这个分支自己进行了哪些 Commit 变更,即 git reflog
。
认识 git reflog 命令
在 HOW - Git 使用(中)- 常用命令和技巧 中我们也介绍过:它提供了一种方式来查看 HEAD 和其他分支引用在仓库的历史记录中的所有变动。这对于找回丢失的提交或者理解操作历史非常有用。
git reflog
这个命令会显示 HEAD 引用的所有变动历史。每一行都会列出一个变动的记录,包括引用的新值和旧值,以及执行该变动的命令和时间。例如:
1c35d40 HEAD@{0}: commit (amend): Updated README file
4e2f3d2 HEAD@{1}: commit: Added README file
a2b4c6d HEAD@{2}: checkout: moving from master to feature
git log 和 git reflog
git log
是用来查看代码提交历史的工具,是仓库状态的“时间线”。git reflog
是用来查看本地操作历史的工具,是你的操作日志。
git log
和 git reflog
的区别
两者都是 Git 中查看历史的工具,但它们的用途和信息来源不同:
1. git log
- 作用:查看提交历史。
- 来源:
git log
显示的是 提交对象(commit object) 的历史记录,也就是代码库中的提交记录。 - 主要特点:
- 显示的是分支或仓库中实际存在的提交。
- 反映代码的演变过程,包括提交信息、提交人、日期、提交内容等。
- 不会显示本地的操作记录(如分支切换、合并等)。
2. git reflog
- 作用:查看引用(
HEAD
、分支指针等)的移动历史。 - 来源:
git reflog
显示的是 本地仓库中的操作记录,包括提交、分支切换、合并、重置(reset
)、变基(rebase
)等。 - 主要特点:
- 包含所有操作的记录,即使这些操作未被提交到远程仓库。
- 是本地操作的日志,不会与远程同步。
- 常用于恢复误操作,比如找回丢失的提交或撤销错误的
reset
。
两者的主要区别
属性 | git log | git reflog |
---|---|---|
显示内容 | 提交历史(commit 记录) | 引用的操作记录(HEAD、分支指针的变动历史) |
数据来源 | 仓库的提交对象 | 本地的操作日志 |
包含范围 | 仅显示提交的记录 | 包括分支切换、重置、合并等操作 |
用途 | 查看代码变更历史 | 恢复误操作、查看分支或 HEAD 的历史状态 |
是否本地独有 | 否,提交会同步到远程 | 是,仅记录本地操作 |
典型场景 | 分析代码提交历史、调试代码 | 恢复误删除的分支或提交,查找 HEAD 的变动记录 |
使用场景举例
-
查看代码提交历史:
如果你想分析代码如何演变、某个功能何时被引入,可以使用git log
查看提交记录。 -
找回误删除的提交:
如果你误用了git reset --hard
丢失了一些代码,可以用git reflog
找回丢失的提交。 -
查找分支切换记录:
想知道某个分支何时创建、切换到何时,可以用git reflog
查看操作历史。
查看分支创建时间
在 Git 中,可以通过查看分支的第一个提交记录来判断分支的创建时间。以下是一些方法来查看分支的创建时间:
方法 1: 查看分支的第一个提交
-
切换到目标分支:
git checkout <branch-name>
-
查看该分支的第一个提交:
git log --reverse
这会从最早的提交开始显示日志,第一个提交通常是分支创建时的提交。
-
限制输出日志为第一个提交:
如果只想查看第一个提交,可以使用以下命令:git log --reverse --pretty=format:"%h %an %ad %s" -1
输出示例:
a1b2c3 John Doe Wed Jan 22 14:30:00 2025 +0800 Initial commit
方法 2: 使用 git reflog show
Git 会记录所有引用(HEAD
、分支等)的移动历史,可以通过 reflog
查看分支的创建时间:
-
查看目标分支的引用历史:
git reflog show <branch-name>
-
找到分支第一次被创建的记录:
记录类似:abc1234 <branch-name>@{0}: branch: Created from master
时间戳会显示在该记录的后面。
方法 3: 脚本精确查找分支创建时间
如果你想通过一个单行命令快速查找分支的第一个提交时间,可以运行以下脚本:
git log --pretty=format:"%h %ad" --reverse <branch-name> | head -n 1
方法 4: 借助 GUI 工具
如果你使用的是 Git 图形化工具(如 SourceTree、GitKraken 或 VSCode 的 Git 插件),可以在分支历史中轻松查看分支的第一个提交时间。
注意事项
- 分支的创建时间可能与第一个提交的时间略有不同,特别是如果分支从另一个分支创建但没有立即进行提交的情况下。
- 如果你在分支上直接修改了历史记录(如
rebase
或cherry-pick
),分支的历史可能会被重写,影响创建时间的判断。