浅析如何使用git reflog和git cherry-pick找回已删除的commit记录、Git cherry-pick简单用法
一、命令介绍
1、git-reflog是用来恢复本地错误操作很重要的一个命令,可以叫做显示可引用的历史版本记录
可引用历史提交版本,什么意思?看下面区别
2、git reflog 与 git log 区别
(1)使用git log
命令只可以查看到HEAD指针及其之前的版本信息,如果版本发生过回退操作,则可能会出现,HEAD指针之后仍存在历史提交版本的情况,而这些提交版本信息通过git log
命令是看不到的。
(2)即:git log
命令是显示当前的HEAD
和它的祖先,递归是沿着当前指针的父亲,父亲的父亲,……,这样的原则
(3)我们可以通过使用git reflog
命令,就可查看到所有历史版本信息。
由于查看所有历史版本信息的目的,大多是为了进行版本回退或恢复操作所使用,从中找到所需的commit索引,所以该命令被命名为reflog
,即:引用日志。
git log
命令与git reflog
命令作用范围示意图:
提示:reflog
并不是Git仓库的一部分,它单独存储,它纯属是本地的。 (git reflog
命令显示的内容,应该是存储在.git/logs/HEAD
文件中,或者是.git/logs/refs
目录中的文件。)
也就是说git reflog
命令中保留了从clone仓库开始,用户所有在本地库中的操作。
3、git cherry-pick
命令的作用,就是将指定的提交(commit)应用于其他分支。
cherry-pick类似于一个定制化的merge,它可以把其它分支上的commit一个个摘下来,合并到当前分支。
对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。
这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge
)。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 Cherry pick。
二、应用场景
git reflog 可以查看所有分支的所有操作记录(包括commit和reset的操作)包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录
实验一下,我 commit 一个记录 test,然后执行
git reset --hard HEAD^
模拟丢失commit记录的情况,删除了刚刚提交的 test 记录,同时文件修改也不见了。
但是如果这次操作错了,怎么办呢?我想要恢复刚刚的 commit,就要使用 git reflog 和 git cherry-pick
使用 git reflog 查看所有的历史提交记录,如下我画线的 2 行就是 commit 的操作记录 和 reset 的操作记录
那我们实际上是需要回到 commit test 的那个版本,记住它的 hash ,执行命令
git cherry-pick fea3f887
可见已经回到之前那个版本咯。
还可以看下这篇文章:《git reflog 和 git cherry-pick 的使用》https://blog.csdn.net/weixin_42365757/article/details/120561795
三、Git cherry-pick简单用法
将一个分支上的某个 commit 合并到另一个分支,可用使用 cherry-pick 命令实现。
比如将 dev 分支上 commit_id 为 f99f2b57b7ee72d55a08e699fbeec34cbac96cb8 的提交合并到 master 分支:
1、切换到 master 分支:git checkout master
2、执行 cherry-pick 命令:git cherry-pick f99f2b57b7ee72d55a08e699fbeec34cbac96cb8
3、推送到远程 master 仓库:git push
注意:master 上新的 commit id 与 dev 上的 id 并不相同,即只是将dev上的修改拷贝过来作为一个新的提交,这就会带来一个问题:cherry-pick之后,dev想再次merge到master,要先对dev分支进行rebase变基。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2017-09-07 项目笔记:创建XML文件和导出功能
2017-09-07 浅析CSS文字描边的三种实现方式
2017-09-07 项目笔记:list页面展示与交互设计
2017-09-07 项目笔记:分层模型建立
2017-09-07 项目笔记:菜单和初始化
2017-09-07 通过form表单上传文件获取后台传来的数据