如何使用Git reflog命令查看特定分支的历史记录?

39

我可以记录一个特定的分支的引用日志吗?

git reflog显示仓库上的所有历史记录。但我想要查看一个特定分支(例如production)的历史记录。是否有方法可以实现?

3个回答

52
正如在文档中所述,git reflog需要一个动作动词(称为<subcommand>)和可选修饰符。默认操作是show,其可选修饰符是要显示的引用名称。
默认情况下,它会显示对HEAD上的操作。(大多数但并不是全部的“日常”命令通过HEAD来操作或者通过HEAD 操作其他参考。因此声称git reflog显示所有历史记录实际上是错误的 - 但它确实显示了大部分,这可能已经足够接近了。)这为您提供了一种立即明显的方法来回答有关显示应用于特定分支名称production的操作的问题:
git reflog show production

正如文档所述,git reflog showgit log -g --abbrev-commit --pretty=oneline 的别名,因此您也可以运行:

git log -g --abbrev-commit --pretty=onelinegit reflog show 的同义词,具体请参阅文档。

git log -g --abbrev-commit --pretty=oneline production

为了获得完全相同的输出,关键在于使用-g开关,它指示git log遍历给定引用的reflog,而不是从该引用指向的提交可达的提交。

(您可以继续省略show动词,因为它仍然是默认值,但对于这种情况,我建议包括它 - 例如,如果您的分支命名为showexpire,则名称将被误认为是动词!)


10

git reflog [show] ref中的ref可以是git哈希值,或者任何git能够解析为哈希值的东西。比如一个分支名:

git reflog production


不,它不是这样的。 - pronebird

2
但我想查看一个特定分支(比如production)的历史记录。
更近期的(Git 2.9.5,2017+)命令应该是git show-branch (-g|--reflog)
 git show-branch --reflog production

-g/--reflog[=<n>[,<base>]] [<ref>]

显示给定引用的最近<n>个引用日志条目。

如果指定了<base>,则从该条目开始返回<n>个条目。
<base>可以指定为计数或日期。

当没有明确指定<ref>参数时,默认为当前分支(或HEAD如果它是分离状态)。


请确保使用 Git 2.35(2022 Q1),因为它修复了一个错误:

查看提交 6527925提交 3474b60提交 6887f69提交 21f0e85提交 f246349(2021年12月2日)由Han-Wen Nienhuys(hanwen
(由Junio C Hamano -- gitster --合并于提交 250ca49,2021年12月15日) show-branch:显示 reflog 消息 Signed-off-by: Han-Wen Nienhuys
以前,--reflog选项会在引用日志消息中查找'\t'。
由于refs.c已经解析了引用日志行,因此永远找不到'\t',并且show-branch --reflog(man)总是会显示"(无)"作为引用日志消息。
请注意: "git show-branch"(man) 的 "--current" 选项应该与 --reflog 模式不兼容,但这一点没有被强制执行,这在 Git 2.37 (2022 年第三季度) 中已经得到了修正。
查看提交41c64ae(2022年4月21日)由Junio C Hamano (gitster)提交。
(由Junio C Hamano -- gitster --提交18254f1中合并,2022年5月25日)

show-branch:使用-g--current是不兼容的

报告者:Gregory David

当在 --reflog 模式下运行 "git show-branch"(man) 命令时,如果给定 "--current" 参数,代码会尝试引用一个甚至不存在的 "reflog" 信息。
这是因为 --current 参数没有准备在该模式下工作。
"--current" 的存在是为了支持以下请求: 我通过命令行列出分支。 这些是我关心的分支,我将它们作为锚定点使用。 我可能在其中一个主分支上,也可能不在。
请确保我能够查看当前分支上与其他分支中的提交相关的内容。
为了满足这个请求,代码检查当前分支是否在命令行列出的分支之中,如果不在,则将其添加到一个数组的末尾,该数组实质上列出了这些对象。
reflog 模式还使用另一个数组列出 reflog 信息,但 "--current" 代码没有将其添加进去。 这导致了 reflog 信息数组末尾存在一个未初始化的槽位,从而导致程序显示垃圾内容或段错误。
捕获不支持(且无意义)的组合,并以使用错误退出。
请注意,git show-branch --no-reflog 是无效的,Git 2.42(2023年第三季度)现在明确指出了这一点。
请参见提交 68cbb20提交 83bb8e5(2023年7月19日),由Junio C Hamano(gitster进行。
(由Junio C Hamano -- gitster --合并于提交 d6966f6,2023年7月27日) show-branch: 拒绝 --[no-](topo|date)-order "git show-branch"(man) --no-topo-order 的行为与 git show-branch --topo-order(man) 完全相同,这是毫无意义的。
这是因为我们通过将变量设置为 REV_SORT_IN_GRAPH_ORDERREV_SORT_BY_COMMIT_DATE 来选择拓扑排序或日期排序,并且 REV_SORT_IN_GRAPH_ORDER 恰好等于 0。 OPT_SET_INT() 宏会将目标变量赋值为其选项的否定形式的 0。

"--no-date-order" 凑巧地出于同样的原因与 "--topo-order" 表现完全一致,目前看起来有点合理,但一旦我们添加第三种排序方式,这种 "有点合理" 就会迅速崩溃。
当只有 A 和 B 两个选择时,非 A 可能是 B,但一旦你的选择范围扩大到 A、B 和 C,非 A 并不意味着 B。

只需将这两个排序选项标记为不接受否定,并添加一个缺失的测试。
"git show-branch --no-reflog" 也不能被否定,所以我们在这里加入一个测试。

你现在会收到一个“未知选项”错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接