开发不害怕——找回丢失分支的常见操作(Git)

366 阅读2分钟

前景介绍:

在日常开发的时候,有可能会遇到这样的情况,同事可能因为不熟练使用Git,他在自己的分支上操作时,可能因为某些原因,要回退到前几次提交之前的版本,比如他最近一次的提交是:commit06,commit06是一个单独的功能模块,它的上一个版本是commit02

正确的处理方法:

git revert -n commit06的版本号
git commit -m "revert 取消commit06的提交" (revert 完提交一下)

但是不熟练Git的同事直接使用了错误的方法:

git reset --hard commit02的版本号

这样就导致了commit02之后的提交都丢失了,通过git log也无法查找到。

撤销提交的方式可参考

接下来介绍,当我们遇到这样的情况该如何处理。

准备一个例子

新建一个文件夹,git init一下,之后创建一个.txt文件。

image.png

image.png 重复四次,然后使用git log查看一下提交记录。

image.png

image.png

错误的使用git reset 到commit02,通过git log 发现我们之前提交的commit03、commit04找不到了。

image.png

image.png

然而同事可能还没有发现这个问题,接着在此分支上开发,并提交了commit05

image.png

image.png

问题大概就是这样,我们的需求就是找回丢失的commit03、commit04。

此时大家可能会有一个想法,我们直接reset到commit04的版本号不就好了?

好像确实是这样,但是我们又会遇到两个问题

1. 我们该如何拿到commit04的版本号呢? 此时再使用 git log 已经查找不到了 commit04了。

2. 我们 reset 到 commit04 之后,commit05 就丢失了。

时光旅行

接下来是本文的重点,看我操作。

第一个问题:

通过 git reflog 解决,该指令会展示你之前所有的 Git 操作。

image.png

接着我们通过 git reset 回到 commit04(当然最好加上 --hard 强制一下)

image.png

第二个问题:

我的 commit05丢失了怎么办?

image.png

通过 git cherry-pick commit05的版本号 把 commit05 找回。

image.png

此时可能会有些冲突,我们手动的解决一下冲突就好。

image.png

cherry-pick的详细介绍可参考: 阮一峰老师的cherry-pick