写在前面
在工作中,我们经常会遇到这种场景,因为误操作,将代码push到了远端仓库,此时就需要恢复代码到我们提交之前的某个版本,本文就一起来看下看下类似的这种场景我们应该如何处理。
1:恢复所有文件
假设现在我们有如下的提交记录:
我们想要恢复的话,只需要执行命令git reset --hard <要恢复到的版本号> ,如下:
$ git reset --hard d0c9bddae
HEAD is now at d0c9bdd 1111
JHP+Administrator@jhp MINGW64 /d/test/test-reset (master)
$ git log -n5 --pretty=oneline
d0c9bddae5a3f0e44f58f830ec47ff2eac89ca49 (HEAD -> master) 1111
783110dcd88c5c8b7acb8d31c5a56ec3705f6419 Initial commit
可以看到恢复成功了,效果就是本地时光倒流了 ,但是此时因为本地的代码版本落后于仓库(其实就是我们开发完代码后,push时,已经有其他人push了代码的场景,必须先pull才行) ,此时我们想要push到远端仓库,必须加上-f 参数,注意该操作很危险,因为会强制删除其他人的提交记录,如下:
$ git push origin master:master -f
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.3]
To https://gitee.com/dongsir2020/test-reset.git
+ 9ed6070...d0c9bdd master -> master (forced update)
2:恢复部分文件
假设现在我们有如下的提交记录:
$ git log -n8 --pretty=oneline
9168bd48aa6090fece2adc374207a171f643d166 (HEAD -> master, origin/master, origin/HEAD) 3333333
d0c9bddae5a3f0e44f58f830ec47ff2eac89ca49 1111
783110dcd88c5c8b7acb8d31c5a56ec3705f6419 Initial commit
$ git show --raw 9168bd48aa6090fece2adc374207a171f643d166
commit 9168bd48aa6090fece2adc374207a171f643d166 (HEAD -> master, origin/master, origin/HEAD)
Author: dongyunqi <dongzhi525@126.com>
Date: Mon Jun 20 18:07:12 2022 +0800
3333333
:100644 100644 90b4516 5114355 M aa.txt
:100644 100644 7accf80 f4eb5cf M bb.txt
可以看到在提交9168bd48a 我们修改了aa.txt ,bb.txt ,但是我们只想要修改aa.txt 到版本d0c9bdda 的提交,就可以执行如下命令:
$ git checkout d0c9bddae5a3f0e44f58f830ec47ff2eac89ca49 aa.txt
Updated 1 path from 2e85e4c
这样做本质就是使用指定版本对本地的文件做了修改,效果和我们自己做的修改是一样的,因此可以如同提交自己修改的代码一样,来提交代码了。如果是文件不多,可以优先考虑使用这种方式来恢复文件,因为这种方式不会删除提交历史,也不会存在删除别人已经提交的代码的风险,在实际工作中需要根据具体情况来选择使用。
写在后面
Git恢复之前版本的两种方法reset、revert(图文详解) 。
|