浅析如何使用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变基。

posted @ 2021-09-07 15:59  古兰精  阅读(1361)  评论(0编辑  收藏  举报