在 Git 的日常开发中,我们可能需要暂存未提交的修改,或者找回误删的提交。Git 提供了 git stash
(储藏)和 git reflog
(引用日志)来帮助开发者管理这些情况。
git stash
允许保存当前工作状态,以便稍后恢复,而不会影响当前分支的提交历史。git reflog
记录了 HEAD 和分支引用的变更历史,即使提交被reset
或rebase
也可以找回。
本章将介绍 Git 储藏的使用方法,以及如何通过引用日志恢复丢失的提交。
12.1 储藏(Stash)
Git 储藏(Stash)用于临时保存当前的未提交更改,并让工作区回到干净状态,以便执行其他操作(如切换分支)。稍后,我们可以恢复这些更改。
12.1.1 基本使用
储藏当前工作区的修改:
git stash
示例输出:
Saved working directory and index state WIP on main: a1b2c3d 修复了一个Bug
此时,工作区变为空,但之前的修改被存储在 Git 的 stash 中。
12.1.2 查看储藏列表
git stash list
示例输出:
stash@{0}: WIP on main: a1b2c3d 修复了一个Bug
stash@{1}: WIP on feature: f4e5g6h 新功能开发
stash@{0}
是最近的储藏,stash@{1}
是之前的储藏。
12.1.3 恢复储藏
恢复最新的储藏(不删除 stash 记录)
git stash apply
恢复并删除储藏记录
git stash pop
恢复特定的储藏
git stash apply stash@{1}
12.1.4 删除储藏
删除最新的储藏
git stash drop
删除特定的储藏
git stash drop stash@{1}
清空所有储藏
git stash clear
12.1.5 创建带信息的储藏
git stash push -m "修复登录功能的Bug"
12.2 引用日志(Reflog)
引用日志(Reflog)记录了 HEAD
和分支引用的变更,即使提交被 reset
或 rebase
也可以通过 reflog
找回。
12.2.1 查看引用日志
git reflog
示例输出:
a1b2c3d HEAD@{0}: commit: 添加 README 文件
f4e5g6h HEAD@{1}: reset: 回退到 f4e5g6h
9d8e7f6 HEAD@{2}: rebase: 变基操作
HEAD@{0}
是当前最新状态HEAD@{1}
是上一次reset
的状态HEAD@{2}
是rebase
之前的状态
12.2.2 恢复误删的提交
如果误用了 git reset --hard
,可以通过 git reflog
找回最近的提交。例如,要恢复 HEAD@{1}
位置的提交:
git reset --hard HEAD@{1}
结论
本章介绍了 Git 的 stash
和 reflog
功能:
git stash
用于临时保存未提交的修改,并允许稍后恢复。git reflog
记录了HEAD
的变更历史,可用于找回误删的提交。
这两个命令是 Git 的救命工具,在开发中遇到突发情况时,能帮助我们快速恢复代码。