阅读 51

git reset怎么恢复,undo commit和revert commit

git是我们常用的版本控制工具,当我们的团队共同开发项目时,由于代码和文件的修改提交,会引起各种各样的冲突,或者产品的需求频繁发生变化,我们决定退回版本并撤回提交

reset,revert都有撤销、回退的意思,但却各有千秋,区别还是很大的所以,应该使用哪个指令,必须根据实际情况来决定。 本文将阐明两者之间的区别,并引导您准确、快速地使用正确的指令来解决实际问题。

在以下示例中,我提交了三次。 初始状态,只有readme1文件,内容为Creating a new branch is quick.t1提交后状态,只有readme1文件,内容为Creating a new branch is quick 1.t2提交后状态, Creating a new branch is quick 1.t2提交后状态将内容更改为Creating a new branch is quick 1 2.t3提交后的状态:添加了测试文件。 本文以git bash为例。

先说reset

reset,使用方法: git reset --hard commit,commit是提交后生成的SHA1,执行此命令将使代码完全恢复为此次提交时的状态,并提交工作区和此次提交后的内容

举例:

原来的项目。 包含Readme.txt文件。

文件内容:

此时更改文件的内容。

Creating a new branch is quick 1.

第一次提交

发送记录:

提交后远程仓库目录和文件的内容:

没有问题。 继续修改文件的内容。Creating a new branch is quick 1 2.第二次提交

在此添加test文件,然后单击第三次提交

那么,现在产品的需求发生了变化。 不需要新功能(自述的第二次修改和新的test文件)。 必须回滚到初始提交“t1”。 如果选择使用reset :

首先导航到t1的commit。 可以从远程仓库的提交历史记录中复制,也可以在命令git log中显示。

(提示,如果最后一行显示“:”,请键入wq退出并返回命令行。 )

复制commit并运行命令:

git reset-- hard 8cb F16 c 0821 d 20 Fe 42 c361 F4 e 3d 75 a 0493 d C5 fc 2

提示,HEAD指向t1,但更新后台时,发现没有任何变化。 这是因为需要执行推送。 但是,这里需要注意。 本地代码恢复为旧版本,但远程仓库在使用git push时会报告错误,因为本地版本与新版本不匹配。 这里需要使用强制提交。 也可以使用git push -f

由于远程仓库代码较新,因此需要执行git pull操作来同步代码,但这不是我们的需要,请忽略它。 git push -f :

请看仓库:

历史记录只剩下t1 :

自述内容也已恢复:

可以看到reset已经完全后退,commit之后的所有更改都将完全消失,包括提交记录。

优点

完全后退到指定版本,干净利落的提交时间线清晰,无冗余缺点

记录将被完全删除,无法再次恢复;再说revert

执行revert时,将生成新的commit记录。 这将使用新commit恢复到以前的commit,但revert会保留已恢复提交后的其他提交内容。 如果以后的提交更改为与要恢复的提交相同的位置,revert将发生冲突。

继续上面的例子,我重新提交了t2和t3,回到了reset以前的状态:

此时,按照reset的思路,使用revert返回t1,执行命令。

git revert 8cb F16 c 0821 d 20 Fe 42 c361 F4 e 3d 75 a 0493 d C5 fc 2错误:

提示冲突了吗? 解决纠纷并提交吧…

headcreatinganewbranchisquick 12.======creatinganewbranchisquick.parent of 8cb F16 c (t1 )上的冲突表明当前内容如下

创建a new

branch is quick 1 2.


而我们要恢复的内容是:

Creating a new branch is quick.

如果对revert命令没有深入了解的话,就可能会产生疑惑,为什么会冲突?而且我实际上是想像reset一样恢复或者说是回退到t1(这里要再次说明一下t1的状态:只有一个readme文件,且内容是Creating a new branch is quick 1),但为什么冲突提示要恢复到Creating a new branch is quick.???这不是初始状态吗?

其实,准确来说,revert是撤销/撤回/反提交的意思,我们不能按reset的思路理解,我们执行git revert t1,这么做其实结果是要撤销t1的提交,注意,仅仅是撤销t1的提交,把t1的修改恢复到t1之前也就是初始的状态,而不会影响t2,t3的提交。但如果t2,t3中修改了t1修改的同一地方,那么就会产生冲突,因为revert意图撤销t1的修改,但发现t2和t3把t1的修改再次修改了,此时,revert意图变得不清晰,因为它无法确定到底是应用你最新的修改,还是恢复到初始状态,这将由你来决定!

所以我们想要恢复t1的状态,那我们就应该撤销t2对t1的修改git revert t2:

git revert fc4889dcb327cff9f8078db6a0d5c601b8e91ae9

执行后会自动进入编辑界面:

这里需要我们修改或输入提交日志,按 “i”,进入输入状态,写完后按ESC退出输入状态,再按“:wq”退出!

成功后,执行 git push:

查看仓库后台:

项目目录:

readme内容:

可见,revert操作成功后,产生了新的commit记录,t2对t1的修改已经恢复,现在的readme就是t1提交后的状态,但同时test文件仍然存在,即t3的提交不受影响!

但如果你说,想要和reset一样,把t2t3的提交也要删除掉,那你就先revert t3,再revert t2,可以达到同样的效果,但这样一来,为何不直接用reset?如果你说既想达到reset的效果,又想有记录防止反悔,那这。。。是一个值得思考的问题!

总结:

reset是彻底回退到指定的commit版本,该commit后的所有commit都将被清除,包括提交历史记录;revert仅仅是撤销指定commit的修改,并不影响后续的commit,但所撤销的commit被后续的commit修改了同一地方则会产生冲突;reset执行后不会产生记录,revert执行后会产生记录;reset执行后无法再次恢复,revert执行后因为不会清除记录,并且会产生新纪录,所以文件不会丢失,你可以多次执行revert恢复到某次改变之前的状态;reset执行后HEAD会后移,而revert的HEAD则一直是向前的;

理清了reset和revert的基本原理,你就明白了在什么时间该使用哪个命令更为合适了!

小提示:在IDEA开发工具中,选中一个文件,右键git选项中会发现有一个Rollback

这里需要跟reset和revert区分一下,rollback并不属于git命令,它的作用是,在文件或代码修改后,但还未commit,想恢复到与远程仓库代码一致的状态,便可以执行rollback操作!

下一篇:一文理清项目中如何正确使用git

git是我们常用的版本控制工具,当我们的团队共同开发项目时,由于代码和文件的修改提交,会引起各种各样的冲突,或者产品的需求频繁发生变化,我们决定退回版本并撤回提交

reset,revert都有撤销、回退的意思,但却各有千秋,区别还是很大的所以,应该使用哪个指令,必须根据实际情况来决定。 本文将阐明两者之间的区别,并引导您准确、快速地使用正确的指令来解决实际问题。

在以下示例中,我提交了三次。 初始状态,只有readme1文件,内容为Creating a new branch is quick.t1提交后状态,只有readme1文件,内容为Creating a new branch is quick 1.t2提交后状态, Creating a new branch is quick 1.t2提交后状态将内容更改为Creating a new branch is quick 1 2.t3提交后的状态:添加了测试文件。 本文以git bash为例。

先说reset

reset,使用方法: git reset --hard commit,commit是提交后生成的SHA1,执行此命令将使代码完全恢复为此次提交时的状态,并提交工作区和此次提交后的内容

举例:

原来的项目。 包含Readme.txt文件。

文件内容:

此时更改文件的内容。

Creating a new branch is quick 1.

第一次提交

发送记录:

提交后远程仓库目录和文件的内容:

没有问题。 继续修改文件的内容。Creating a new branch is quick 1 2.第二次提交

在此添加test文件,然后单击第三次提交

那么,现在产品的需求发生了变化。 不需要新功能(自述的第二次修改和新的test文件)。 必须回滚到初始提交“t1”。 如果选择使用reset :

首先导航到t1的commit。 可以从远程仓库的提交历史记录中复制,也可以在命令git log中显示。

(提示,如果最后一行显示“:”,请键入wq退出并返回命令行。 )

复制commit并运行命令:

git reset-- hard 8cb F16 c 0821 d 20 Fe 42 c361 F4 e 3d 75 a 0493 d C5 fc 2

提示,HEAD指向t1,但更新后台时,发现没有任何变化。 这是因为需要执行推送。 但是,这里需要注意。 本地代码恢复为旧版本,但远程仓库在使用git push时会报告错误,因为本地版本与新版本不匹配。 这里需要使用强制提交。 也可以使用git push -f

由于远程仓库代码较新,因此需要执行git pull操作来同步代码,但这不是我们的需要,请忽略它。 git push -f :

请看仓库:

历史记录只剩下t1 :

自述内容也已恢复:

可以看到reset已经完全后退,commit之后的所有更改都将完全消失,包括提交记录。

优点

完全后退到指定版本,干净利落的提交时间线清晰,无冗余缺点

记录将被完全删除,无法再次恢复;再说revert

执行revert时,将生成新的commit记录。 这将使用新commit恢复到以前的commit,但revert会保留已恢复提交后的其他提交内容。 如果以后的提交更改为与要恢复的提交相同的位置,revert将发生冲突。

继续上面的例子,我重新提交了t2和t3,回到了reset以前的状态:

此时,按照reset的思路,使用revert返回t1,执行命令。

git revert 8cb F16 c 0821 d 20 Fe 42 c361 F4 e 3d 75 a 0493 d C5 fc 2错误:

提示冲突了吗? 解决纠纷并提交吧…

headcreatinganewbranchisquick 12.======creatinganewbranchisquick.parent of 8cb F16 c (t1 )上的冲突表明当前内容如下

创建a new

branch is quick 1 2.


而我们要恢复的内容是:

Creating a new branch is quick.

如果对revert命令没有深入了解的话,就可能会产生疑惑,为什么会冲突?而且我实际上是想像reset一样恢复或者说是回退到t1(这里要再次说明一下t1的状态:只有一个readme文件,且内容是Creating a new branch is quick 1),但为什么冲突提示要恢复到Creating a new branch is quick.???这不是初始状态吗?

其实,准确来说,revert是撤销/撤回/反提交的意思,我们不能按reset的思路理解,我们执行git revert t1,这么做其实结果是要撤销t1的提交,注意,仅仅是撤销t1的提交,把t1的修改恢复到t1之前也就是初始的状态,而不会影响t2,t3的提交。但如果t2,t3中修改了t1修改的同一地方,那么就会产生冲突,因为revert意图撤销t1的修改,但发现t2和t3把t1的修改再次修改了,此时,revert意图变得不清晰,因为它无法确定到底是应用你最新的修改,还是恢复到初始状态,这将由你来决定!

所以我们想要恢复t1的状态,那我们就应该撤销t2对t1的修改git revert t2:

git revert fc4889dcb327cff9f8078db6a0d5c601b8e91ae9

执行后会自动进入编辑界面:

这里需要我们修改或输入提交日志,按 “i”,进入输入状态,写完后按ESC退出输入状态,再按“:wq”退出!

成功后,执行 git push:

查看仓库后台:

项目目录:

readme内容:

可见,revert操作成功后,产生了新的commit记录,t2对t1的修改已经恢复,现在的readme就是t1提交后的状态,但同时test文件仍然存在,即t3的提交不受影响!

但如果你说,想要和reset一样,把t2t3的提交也要删除掉,那你就先revert t3,再revert t2,可以达到同样的效果,但这样一来,为何不直接用reset?如果你说既想达到reset的效果,又想有记录防止反悔,那这。。。是一个值得思考的问题!

总结:

reset是彻底回退到指定的commit版本,该commit后的所有commit都将被清除,包括提交历史记录;revert仅仅是撤销指定commit的修改,并不影响后续的commit,但所撤销的commit被后续的commit修改了同一地方则会产生冲突;reset执行后不会产生记录,revert执行后会产生记录;reset执行后无法再次恢复,revert执行后因为不会清除记录,并且会产生新纪录,所以文件不会丢失,你可以多次执行revert恢复到某次改变之前的状态;reset执行后HEAD会后移,而revert的HEAD则一直是向前的;

理清了reset和revert的基本原理,你就明白了在什么时间该使用哪个命令更为合适了!

小提示:在IDEA开发工具中,选中一个文件,右键git选项中会发现有一个Rollback

这里需要跟reset和revert区分一下,rollback并不属于git命令,它的作用是,在文件或代码修改后,但还未commit,想恢复到与远程仓库代码一致的状态,便可以执行rollback操作!

下一篇:一文理清项目中如何正确使用git


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐