在开发过程中,我们可以随时将代码回退。
在介绍回退之前,先提一下git reflog这条命令,这条命令很有用,git log只能查看已经提交的记录,那些删除的记录则看不到。
换句话说,git reflog记录了所有的操作。
假设本地仓库已经有了几次提交,如下:
commit 4fb2b11aff3849e1d423a2c9694897ae4a50ebae
Author: songchong <songchong@artekmicro.com>
Date: Mon Sep 3 10:13:13 2018 +0800
77777777777777
commit 67332c1f1610072f2d6767b47e36c9b2e9b2976f
Author: songchong <songchong@artekmicro.com>
Date: Mon Sep 3 10:12:52 2018 +0800
666666666666
commit 798e558540e28b919bedae0bcc26e342e902f0b6
Author: songchong <songchong@artekmicro.com>
Date: Mon Sep 3 10:12:27 2018 +0800
555555555555
commit 4acf061c68b13e74992e6f117c05890b76d8d644
Author: songchong <songchong@artekmicro.com>
Date: Mon Sep 3 10:12:01 2018 +0800
test reset hard
commit 9ed7ef2909d1840be64a7719c0d068456def60c2
Author: songchong <songchong@artekmicro.com>
Date: Thu Aug 23 10:58:48 2018 +0800
add usb
commit b1ebd90e1174ee954e241f11d24e937e2e3421b1
Author: songchong <songchong@artekmicro.com>
Date: Thu Aug 23 10:58:13 2018 +0800
add test.c
现在位于77777777777777的提交。就在此时如果想把代码回退到555555555555时提交的状态。
则可以使用git reset --hard 798e558540e28b919bedae0bcc26e342e902f0b6
(也可以使用git reflog中显示出来的简化conmmit ID,git reset --hard 798e558)
这样代码就回退到555555555555提交时的状态。当你查看完之后,你想再次把代码回退到77777777777777时的提交,但是这是git log已经查看不到555555555555后面的提交记录。
songchong@srv-artek-pad:~/mytest/gittest$ git log
commit 4acf061c68b13e74992e6f117c05890b76d8d644
Author: songchong <songchong@artekmicro.com>
Date: Mon Sep 3 10:12:01 2018 +0800
test reset hard
commit 9ed7ef2909d1840be64a7719c0d068456def60c2
Author: songchong <songchong@artekmicro.com>
Date: Thu Aug 23 10:58:48 2018 +0800
add usb
commit b1ebd90e1174ee954e241f11d24e937e2e3421b1
Author: songchong <songchong@artekmicro.com>
Date: Thu Aug 23 10:58:13 2018 +0800
add test.c
这时 git reflog就出场了。它会记录你所有的操作记录。
songchong@srv-artek-pad:~/mytest/gittest$ git reflog
4acf061 HEAD@{0}: reset: moving to 4acf061
4fb2b11 HEAD@{1}: commit: 77777777777777
67332c1 HEAD@{2}: commit: 666666666666
798e558 HEAD@{3}: commit: 555555555555
4acf061 HEAD@{4}: commit: test reset hard
9ed7ef2 HEAD@{5}: checkout: moving from master to work
ff81e52 HEAD@{6}: commit: git test
9ed7ef2 HEAD@{7}: checkout: moving from work to master
9ed7ef2 HEAD@{8}: checkout: moving from master to work
9ed7ef2 HEAD@{9}: reset: moving to HEAD^
81e2112 HEAD@{10}: commit: git reset test
9ed7ef2 HEAD@{11}: reset: moving to 9ed7ef2909d1840be64a7719c0d068456def60c2
ce30b18 HEAD@{12}: commit (amend): 6ss
12dda2c HEAD@{13}: commit: 6ss
230e2a9 HEAD@{14}: rebase: aborting
230e2a9 HEAD@{15}: checkout: moving from master to 230e2a9
230e2a9 HEAD@{16}: commit: add 5s
a6ce37f HEAD@{17}: reset: moving to HEAD^
c130472 HEAD@{18}: commit: add 4s
a6ce37f HEAD@{19}: reset: moving to HEAD^
3868094 HEAD@{20}: commit (amend): add 4sss
7d0b26d HEAD@{21}: commit (amend): add 4ss
3c934a5 HEAD@{22}: commit: add 4s
a6ce37f HEAD@{23}: commit: add 3s
9ed7ef2 HEAD@{24}: commit: add usb
这时执行 git rest --hard 4fb2b11 就能回到77777777777777时的状态,再来看下git reflog
songchong@srv-artek-pad:~/mytest/gittest$ git reflog
4fb2b11 HEAD@{0}: reset: moving to 4fb2b11
4acf061 HEAD@{1}: reset: moving to 4acf061
4fb2b11 HEAD@{2}: commit: 77777777777777
67332c1 HEAD@{3}: commit: 666666666666
798e558 HEAD@{4}: commit: 555555555555
4acf061 HEAD@{5}: commit: test reset hard
9ed7ef2 HEAD@{6}: checkout: moving from master to work
ff81e52 HEAD@{7}: commit: git test
9ed7ef2 HEAD@{8}: checkout: moving from work to master
9ed7ef2 HEAD@{9}: checkout: moving from master to work
9ed7ef2 HEAD@{10}: reset: moving to HEAD^
81e2112 HEAD@{11}: commit: git reset test
9ed7ef2 HEAD@{12}: reset: moving to 9ed7ef2909d1840be64a7719c0d068456def60c2
ce30b18 HEAD@{13}: commit (amend): 6ss