前景介绍:
在日常开发的时候,有可能会遇到这样的情况,同事可能因为不熟练使用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文件。
重复四次,然后使用git log查看一下提交记录。
错误的使用git reset 到commit02,通过git log 发现我们之前提交的commit03、commit04找不到了。
然而同事可能还没有发现这个问题,接着在此分支上开发,并提交了commit05
问题大概就是这样,我们的需求就是找回丢失的commit03、commit04。
此时大家可能会有一个想法,我们直接reset到commit04的版本号不就好了?
好像确实是这样,但是我们又会遇到两个问题
。
1. 我们该如何拿到commit04的版本号呢? 此时再使用 git log 已经查找不到了 commit04了。
2. 我们 reset 到 commit04 之后,commit05 就丢失了。
时光旅行
接下来是本文的重点,看我操作。
第一个问题:
通过 git reflog
解决,该指令会展示你之前所有的 Git 操作。
接着我们通过 git reset
回到 commit04(当然最好加上 --hard 强制一下)
第二个问题:
我的 commit05
丢失了怎么办?
通过 git cherry-pick commit05的版本号
把 commit05 找回。
此时可能会有些冲突,我们手动的解决一下冲突就好。
cherry-pick的详细介绍可参考: 阮一峰老师的cherry-pick