Git reflog

Git 高级

Amanda Crawford-Adamo

Software and Data Engineer

什么是 Git Reflog?

  1. 本地记录仓库中所有引用更新
  2. Reflog 存于本地 .git/logs/refs/heads/ 目录下
  3. 记录分支尖端和 HEAD 位置的变更
  4. 作为 Git 操作的安全网
  5. 帮助恢复误改或误删

Git 历史变更示例图

Git 高级

Git Reflog 与 Git Log

功能 Git Reflog Git Log
目的 显示本地仓库中的引用更新与重写 仅显示提交历史
范围 仅本地仓库 本地与远程仓库
内容 所有引用更新(提交、reset、merge 等) 仅提交
持久性 临时(通常 90 天) 永久(仓库历史的一部分)
用途 恢复丢失提交,理解近期操作 查看项目历史,理解功能开发
Git 高级

Reflog 命令

  • 显示日志数据与 HEAD 活动
    git reflog
    git reflog show
    
  • 清理旧日志或不可达条目
    git reflog expire
    
Git 高级

Reflog 输出结构

reflog 输出文本结构拆解

终端中的 reflog 输出示例

组件 说明
short-hash 提交哈希的缩写
ref 通常为 HEAD,也可为分支名
index 在 reflog 中的位置(0 为最新)
action 操作类型(commit、reset、merge 等)
descriptions 操作描述
1 https://hackernoon.com/time-to-rewrite-your-git-history-effectively-with-git-reflog
Git 高级

过滤:Since 与 Until

  • since = 从此时间点开始显示条目

    git reflog --since "time-qualifer"
    
  • until = 显示截至此时间点的条目

    git reflog --until "time-qualifer"
    
用法
git reflog --since="1 week ago"
git reflog --until="yesterday"
git reflog --until="2024-01-01"
Git 高级

恢复被删除的分支

场景

  • 创建了名为 etl-feature 的分支
  • 将 ETL 功能改动提交到该分支
  • 误删了此分支
  • 所有代码改动丢失

如何恢复 etl-feature 分支?

解决方案

  1. git reflog 找到被删分支尖端提交的哈希
  2. 用 git checkout 将 HEAD 移到该提交哈希
  3. 以当前 HEAD 所指向提交创建一个新分支
git reflog
git checkout <hash>
git checkout -b <branch-name>
1 https://stackoverflow.com/questions/3640764/can-i-recover-a-branch-after-its-deletion-in-git
Git 高级

Git Reset

  • 将 HEAD 移动到指定提交对象。
  • 根据重置类型,更新工作区和暂存区。
重置类型 命令 对工作区的影响 对暂存区的影响
Soft git reset --soft <commit> 无变化 更改保持已暂存
Mixed(默认) git reset --mixed <commit> 无变化 更改被取消暂存
Hard git reset --hard <commit> 放弃更改 放弃更改
Git 高级

查找丢失的提交

场景

  • 提交和变基后测试开始失败
  • 不明提交导致失败
  • 需要回到通过状态

如何回退到之前通过的 ETL 脚本更改?

解决方案

  1. 用 Git Reflog 找到被删提交的哈希
  2. 用 git reset 回退到测试通过的提交
git reflog
git reset --soft HEAD@{1}
Git 高级

最佳实践

  • 强大:可恢复丢失的代码和提交
  • 使用清晰的提交信息
  • 定期推送到远程
  • 谨慎使用强制推送

当出错时,Reflog 是我们的本地时光机

一张回到过去的时钟图片

Git 高级

Passons à la pratique !

Git 高级

Preparing Video For Download...