git-reflog找回误删除的commit

git 用得多了,难免不会使用到类似 git reset --hard COMMIT 这样回退到某次提交的命令,这个做法有个坏处就是回退到某个版本之后,中间的版本就丢了。
这时候 git reflog + git cherry-pick 命令配合使用可以把之前误删除的commit给找回了。

1
2
3
4
5
6
7
$git reflog
6c832d6 HEAD@{0}: reset: moving to 6c832d68f725097351c12eecc2b5c2b18a42c1ef
57bd6b7 HEAD@{1}: commit: ci C
7fdfcae HEAD@{2}: commit: ci B
0742660 HEAD@{3}: commit: ci A
6c832d6 HEAD@{4}: checkout: moving from master to develop
6c832d6 HEAD@{5}: commit (initial): first ci

当回退到 first ci 这次提交的时候,git log就没有A,B,C三次提交了。创建并切换到new_branch分支上,把ABC三次提交的内容扔进去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$git co -b new_branch
$git reflog
6c832d6 HEAD@{0}: checkout: moving from develop to new_branch
6c832d6 HEAD@{1}: reset: moving to 6c832d68f725097351c12eecc2b5c2b18a42c1ef
57bd6b7 HEAD@{2}: commit: ci C
7fdfcae HEAD@{3}: commit: ci B
0742660 HEAD@{4}: commit: ci A
6c832d6 HEAD@{5}: checkout: moving from master to develop
6c832d6 HEAD@{6}: commit (initial): first ci

$git cherry-pick 0742660
[new a1a0daa] ci A
1 file changed, 1 insertion(+)
$git cherry-pick 7fdfcae
[new d200ef4] ci B
1 file changed, 1 insertion(+)
$git cherry-pick 57bd6b7
[new 059caa3] ci C
1 file changed, 1 insertion(+)

这样new_branch分支上就已经是最新包含ABC三次提交的代码了。
有一点需要注意的是,git cherry-pick 的时候,必须按照先后顺序找回A,然后B,最后才是C,要不然中间可能会出现一些冲突,如果文件多解决起来就比较麻烦,按照顺序找回版本则可以避免这个问题。

以上仅是个人使用经验,不一定代表正确的思路,仅供参考。