在 Git 的日常开发中,我们可能需要暂存未提交的修改,或者找回误删的提交。Git 提供了 git stash(储藏)和 git reflog(引用日志)来帮助开发者管理这些情况。

  • git stash 允许保存当前工作状态,以便稍后恢复,而不会影响当前分支的提交历史。
  • git reflog 记录了 HEAD 和分支引用的变更历史,即使提交被 resetrebase 也可以找回。

本章将介绍 Git 储藏的使用方法,以及如何通过引用日志恢复丢失的提交。


12.1 储藏(Stash)

Git 储藏(Stash)用于临时保存当前的未提交更改,并让工作区回到干净状态,以便执行其他操作(如切换分支)。稍后,我们可以恢复这些更改。

12.1.1 基本使用

储藏当前工作区的修改:

  1. git stash

示例输出:

  1. Saved working directory and index state WIP on main: a1b2c3d 修复了一个Bug

此时,工作区变为空,但之前的修改被存储在 Git 的 stash 中。

12.1.2 查看储藏列表

  1. git stash list

示例输出:

  1. stash@{0}: WIP on main: a1b2c3d 修复了一个Bug
  2. stash@{1}: WIP on feature: f4e5g6h 新功能开发

stash@{0} 是最近的储藏,stash@{1} 是之前的储藏。

12.1.3 恢复储藏

  1. 恢复最新的储藏(不删除 stash 记录)

    1. git stash apply
  2. 恢复并删除储藏记录

    1. git stash pop
  3. 恢复特定的储藏

    1. git stash apply stash@{1}

12.1.4 删除储藏

  1. 删除最新的储藏

    1. git stash drop
  2. 删除特定的储藏

    1. git stash drop stash@{1}
  3. 清空所有储藏

    1. git stash clear

12.1.5 创建带信息的储藏

  1. git stash push -m "修复登录功能的Bug"

12.2 引用日志(Reflog)

引用日志(Reflog)记录了 HEAD 和分支引用的变更,即使提交被 resetrebase 也可以通过 reflog 找回。

12.2.1 查看引用日志

  1. git reflog

示例输出:

  1. a1b2c3d HEAD@{0}: commit: 添加 README 文件
  2. f4e5g6h HEAD@{1}: reset: 回退到 f4e5g6h
  3. 9d8e7f6 HEAD@{2}: rebase: 变基操作
  • HEAD@{0} 是当前最新状态
  • HEAD@{1} 是上一次 reset 的状态
  • HEAD@{2}rebase 之前的状态

12.2.2 恢复误删的提交

如果误用了 git reset --hard,可以通过 git reflog 找回最近的提交。例如,要恢复 HEAD@{1} 位置的提交:

  1. git reset --hard HEAD@{1}

结论

本章介绍了 Git 的 stashreflog 功能:

  • git stash 用于临时保存未提交的修改,并允许稍后恢复。
  • git reflog 记录了 HEAD 的变更历史,可用于找回误删的提交。

这两个命令是 Git 的救命工具,在开发中遇到突发情况时,能帮助我们快速恢复代码。