博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Git如何回滚代码?
阅读量:6190 次
发布时间:2019-06-21

本文共 3469 字,大约阅读时间需要 11 分钟。

摘要: 多年以后,你面对一个需要回滚的Git仓库,准会想起这篇博客。

某一天,用户跟我反馈,他不能分配任务了。我去看了一下捕获的报错信息:

可知,出错原因是前端发送的请求参数有问题。这个悲伤的故事是这样的:后端同时修改了多个接口,但是前端没有及时修改对应的接口调用。

这个问题不难解决,回滚代码就好了,但是,Git如何回滚代码呢?我花了点时间研究了一下。

测试仓库:

我写了一个非常简单的,master分支只有3个commit,每个commit只是添加一个文件,因此一共有3个文件:01.txt, 02.txt, 03.txt。

git logcommit b39476b9c730d312266fe9bc7f63e795f9ba856fAuthor: kiwenlau 
Date: Thu Jan 18 14:58:06 2018 +0800 3个文件commit 3821210392184432de18b596cee58ab7924e39f9Author: kiwenlau
Date: Thu Jan 18 14:57:38 2018 +0800 2个文件commit 55d3012564e94a39f6686c0e532c0459ddc41ec4Author: kiwenlau
Date: Thu Jan 18 14:56:41 2018 +0800 1个文件复制代码

本文介绍的所有回滚代码的命令,都会在一个新的分支执行,方便大家理解:

示例 分支 说明 命令
1 撤销最近1次commit git revert HEAD
2 撤销某个commit git revert 3821210392184432de18b596cee58ab7924e39f9
3 撤销多个连续commit git revert b39476b9c730d312266fe9bc7f63e795f9ba856f 3821210392184432de18b596cee58ab7924e39f9
4 撤销多个非连续commit git revert b39476b9c730d312266fe9bc7f63e795f9ba856f 3821210392184432de18b596cee58ab7924e39f9
5 重置为某个commit(不保存代码) git reset --hard 55d3012564e94a39f6686c0e532c0459ddc41ec4
6 重置为某个commit(保存代码) git reset --soft 55d3012564e94a39f6686c0e532c0459ddc41ec4

git revert : 撤销特定commit

Git的每一个commit都对应着某些代码改动,那万一改错了呢?这时可以使用git reset来撤销某一次commit的改动。所谓撤销,就是把修改了的代码再改回来

示例1

最简单的一个场景,就是撤销最近的1次commit:

git revert HEAD 复制代码

最近1次commit是新增03.txt,撤销这个commit之后,分支就只剩下2个文件了:01.txt, 02.txt。

示例2

有时,可能需要撤销某个特定commit,比如,当我需要撤销第2个commit时,指定对应ID即可:

git revert 3821210392184432de18b596cee58ab7924e39f9复制代码

最近1次commit是新增02.txt,撤销这个commit之后,分支就只剩下2个文件了:01.txt, 03.txt。

由这个示例可知,使用git revert撤销commit时,仅仅针对所撤销的commit,与任何其他commit无关

示例3

假设我们再做某个功能时,进行了多次commit,需要全部撤销。我们当然可以一个个commit依次revert,这样比较麻烦,其实可以一次性搞定:

git revert b39476b9c730d312266fe9bc7f63e795f9ba856f 3821210392184432de18b596cee58ab7924e39f9复制代码

撤销了后面2个commit,分支就只剩下1个文件了:01.txt。

示例4

示例3中所撤销的2个commit是连续的,其实,因为revert操作只与单个commit相关,我们也可以撤销多个非连续的commit:

git revert b39476b9c730d312266fe9bc7f63e795f9ba856f  55d3012564e94a39f6686c0e532c0459ddc41ec4复制代码

撤销了第1个和第3个commit,分支就只剩下1个文件了:02.txt。

git reset:重置为特定commit

示例5

在示例3中,撤销了两个连续的commit,这样做等价于将代码重置为第1个commit的状态:仅有01.txt这1个文件。使用git revert命令有些麻烦,我们可以直接使用git reset命令来实现:

git reset --hard 55d3012564e94a39f6686c0e532c0459ddc41ec4复制代码

将仓库强制重置为第1个commit,这样分支就只剩下1个文件了:01.txt。git reset --hardgit revert效果看起来一样,但是不同点在于,前者直接删除了后面2个commit及其代码,没有保存commi历史,因此**这个操作是不可逆的!**使用时应该特别小心。

如果你的本地仓库与远程仓库在reset之前是同步过的,reset之后,两者的commit不一致,本地仓库的commit落后与远程仓库,这样会导致push失败:

git pushTo git@github.com:Fundebug/git-rollback.git ! [rejected]        test05 -> test05 (non-fast-forward)error: failed to push some refs to 'git@github.com:Fundebug/git-rollback.git'hint: Updates were rejected because the tip of your current branch is behindhint: its remote counterpart. Integrate the remote changes (e.g.hint: 'git pull ...') before pushing again.hint: See the 'Note about fast-forwards' in 'git push --help' for details.复制代码

这是需要使用**--force**选项,这样远程仓库会被强制覆盖:

git push --force复制代码

示例6

reset时使用**--hard选项是一个很危险的操作,因为它把commit以及代码全删了,没法恢复。如果你只希望删除commit,而保留修改过的代码的话,可以使用--soft**选项。

git reset --soft 55d3012564e94a39f6686c0e532c0459ddc41ec4复制代码

这时,后面2个commit也被删除了,当前commit为第1个commit。但是,02.txt与03.txt并没有被删除。

git statusOn branch test06Changes to be committed:  (use "git reset HEAD 
..." to unstage) new file: 02.txt new file: 03.txt复制代码

这就意味着,当你的commit的代码有一些小问题时,可以重置commit,修改一下代码,如何重新commit即可。

参考

版权声明:

转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/01/24/git-rollback-tutorial/

你可能感兴趣的文章
iphone-common-codes-ccteam源代码 CCPlistFileWritter.m
查看>>
工作心理学(未完成)
查看>>
Linux 第一天
查看>>
第2章 数字之魅——数字中的技巧2.1
查看>>
谈谈等概率不重复随机数生成算法中的大学问
查看>>
仲兆鹏 160809329
查看>>
主流浏览器默认限制的非安全端口号有哪些
查看>>
MongoDB(一)
查看>>
Vue实战狗尾草博客后台管理系统第三章
查看>>
Tornado 之 Session的处理
查看>>
UNIX文件I/O
查看>>
noip模拟【array】
查看>>
利用Python程序实现批量doc文档到pdf的转换
查看>>
Newtonsoft.Json 的序列化与反序列化
查看>>
Mac 下ll命令 command not found
查看>>
F查询和Q查询,摘自李文周老师
查看>>
【工作总结】IPD开发管理流程
查看>>
java代码--实现随机输出10个随机数,并显示最大值,最小值
查看>>
asp.net 中使用JQuery Ajax 上传文件
查看>>
http动态调用webserive
查看>>