這篇文章主要介紹“git中reset和revert的區(qū)別有哪些”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“git中reset和revert的區(qū)別有哪些”文章能幫助大家解決問(wèn)題。
創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)裕民,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):18980820575
區(qū)別:1、reset是徹底回退到指定的commit版本,該commit后的所有commit都將被清除;而revert僅是撤銷(xiāo)指定commit的修改,并不影響后續(xù)的commit。2、reset執(zhí)行后不會(huì)產(chǎn)生記錄,revert執(zhí)行后會(huì)產(chǎn)生記錄。
git是我們常用的版本管理工具,我們團(tuán)隊(duì)在合作開(kāi)發(fā)項(xiàng)目時(shí),時(shí)常會(huì)因?yàn)榇a及文件的修改提交,導(dǎo)致各種各樣的沖突,還有產(chǎn)品需求的頻繁變更,致使我們不得不做出回退版本,撤回提交這樣的決定,那么此時(shí),reset和revert命令,就派上了用場(chǎng)!
reset,revert都有撤銷(xiāo)、回退的意思,但卻各有千秋,區(qū)別還是很大的,所以該使用哪種命令一定要結(jié)合實(shí)際情況來(lái)決定,本文就是帶大家搞清楚兩者的區(qū)別,然后能準(zhǔn)確快速的使用正確的命令去解決實(shí)際問(wèn)題!
下面的例子中,我有3次提交: 初始狀態(tài),只有readme一個(gè)文件,內(nèi)容為Creating a new branch is quick. t1提交后狀態(tài):只有readme一個(gè)文件,內(nèi)容修改為Creating a new branch is quick 1. t2提交后狀態(tài):只有readme一個(gè)文件,內(nèi)容修改為Creating a new branch is quick 1 2. t3提交后狀態(tài):新增了test文件.
本文以git bash為例:
先說(shuō)reset:
reset,使用方法:git reset --hard commit
,commit是提交后產(chǎn)生的SHA1,執(zhí)行該命令后,代碼會(huì)完全回退到本次提交時(shí)的狀態(tài),工作暫存區(qū)以及本次提交后面的提交內(nèi)容將會(huì)被完全清除,包括提交記錄!
舉例:
原項(xiàng)目,包含一個(gè)Readme.txt文件:
文件內(nèi)容:
此時(shí)我將修改文件內(nèi)容為:
Creating a new branch is quick 1.
進(jìn)行第一次提交:
提交記錄:
提交后的遠(yuǎn)程倉(cāng)庫(kù)目錄及文件內(nèi)容:
沒(méi)有問(wèn)題,繼續(xù)修改文件內(nèi)容:Creating a new branch is quick 1 2. ,進(jìn)行第二次提交:
現(xiàn)在我將新增一個(gè)test文件,進(jìn)行第三次提交:
好了,現(xiàn)在產(chǎn)品需求變更了,新增的功能(readme的第二次修改和新增的test文件)不需要了,要求回退到第一次提交“t1”,如果我們選擇使用reset:
首先定位到t1的commit,可以從遠(yuǎn)程倉(cāng)庫(kù)提交歷史記錄中復(fù)制,也可以用命令git log
查看:
(小提示,如果最后一行出現(xiàn)“:”,則輸入wq退出回到命令行即可?。?/em>
復(fù)制commit,執(zhí)行命令:
git reset --hard 8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2
提示,HEAD已經(jīng)指向了t1,但你刷新后臺(tái)時(shí),發(fā)現(xiàn)并沒(méi)有什么變化,這是因?yàn)槲覀冞€需要執(zhí)行一下push,但這里需要注意的是,因?yàn)楸镜卮a回到了舊版本,但遠(yuǎn)程倉(cāng)庫(kù)是新版本和本地不一致,所以你在用git push時(shí)會(huì)報(bào)錯(cuò),這里我們需要使用強(qiáng)制提交,git push -f
,我們也可以使用git status
查看當(dāng)前狀態(tài):
意思是告訴你,遠(yuǎn)程倉(cāng)庫(kù)代碼較新,需要你執(zhí)行 git pull
操作以同步代碼,但這并不是我們的需求,所以我們不用理會(huì),執(zhí)行,git push -f
:
再看倉(cāng)庫(kù):
歷史記錄只剩下了t1:
readme內(nèi)容也得到了恢復(fù):
可見(jiàn),reset是徹徹底底的回退,該commit之后的所有修改將完全消失,包括提交記錄。
優(yōu)點(diǎn):
徹底回退到指定版本,干凈清爽;
提交時(shí)間線(xiàn)清晰,沒(méi)有冗雜;
缺點(diǎn):
記錄徹底清除,無(wú)法再次恢復(fù);
再說(shuō)revert:
revert執(zhí)行后會(huì)產(chǎn)生新的commit記錄,是通過(guò)一次新的commit來(lái)恢復(fù)到之前舊的commit,但revert會(huì)保留恢復(fù)的該次提交后面的其它提交內(nèi)容,假如后面的提交與要恢復(fù)的提交更改了同一地方,此時(shí)用revert就會(huì)產(chǎn)生沖突!
我們繼續(xù)以上面的例子為例,我重新執(zhí)行了t2和t3提交,恢復(fù)到reset之前的狀態(tài):
此時(shí),我們按reset的思路,使用revert恢復(fù)到t1,執(zhí)行命令:
git revert 8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2
報(bào)錯(cuò):
提示沖突了?讓我們解決掉沖突后提交…
<<<<<<< HEAD Creating a new branch is quick 1 2. ======= Creating a new branch is quick. >>>>>>> parent of 8cbf16c (t1)
上面的沖突表示,當(dāng)前的內(nèi)容是:
Creating a new branch is quick 1 2.
而我們要恢復(fù)的內(nèi)容是:
Creating a new branch is quick.
如果對(duì)revert命令沒(méi)有深入了解的話(huà),就可能會(huì)產(chǎn)生疑惑,為什么會(huì)沖突?而且我實(shí)際上是想像reset一樣恢復(fù)或者說(shuō)是回退到t1(這里要再次說(shuō)明一下t1的狀態(tài):只有一個(gè)readme文件,且內(nèi)容是Creating a new branch is quick 1),但為什么沖突提示要恢復(fù)到Creating a new branch is quick.???這不是初始狀態(tài)嗎?
其實(shí),準(zhǔn)確來(lái)說(shuō),revert是撤銷(xiāo)/撤回/反提交的意思,我們不能按reset的思路理解,我們執(zhí)行git revert t1
,這么做其實(shí)結(jié)果是要撤銷(xiāo)t1的提交,注意,僅僅是撤銷(xiāo)t1的提交,把t1的修改恢復(fù)到t1之前也就是初始的狀態(tài),而不會(huì)影響t2,t3的提交。但如果t2,t3中修改了t1修改的同一地方,那么就會(huì)產(chǎn)生沖突,因?yàn)閞evert意圖撤銷(xiāo)t1的修改,但發(fā)現(xiàn)t2和t3把t1的修改再次修改了,此時(shí),revert意圖變得不清晰,因?yàn)樗鼰o(wú)法確定到底是應(yīng)用你最新的修改,還是恢復(fù)到初始狀態(tài),這將由你來(lái)決定!
所以我們想要恢復(fù)t1的狀態(tài),那我們就應(yīng)該撤銷(xiāo)t2對(duì)t1的修改git revert t2
:
git revert fc4889dcb327cff9f8078db6a0d5c601b8e91ae9
執(zhí)行后會(huì)自動(dòng)進(jìn)入編輯界面:
這里需要我們修改或輸入提交日志,按 “i”,進(jìn)入輸入狀態(tài),寫(xiě)完后按ESC退出輸入狀態(tài),再按“:wq”退出!
成功后,執(zhí)行 git push:
查看倉(cāng)庫(kù)后臺(tái):
項(xiàng)目目錄:
readme內(nèi)容:
可見(jiàn),revert操作成功后,產(chǎn)生了新的commit記錄,t2對(duì)t1的修改已經(jīng)恢復(fù),現(xiàn)在的readme就是t1提交后的狀態(tài),但同時(shí)test文件仍然存在,即t3的提交不受影響!
但如果你說(shuō),想要和reset一樣,把t2t3的提交也要?jiǎng)h除掉,那你就先revert t3,再revert t2,可以達(dá)到同樣的效果,但這樣一來(lái),為何不直接用reset?如果你說(shuō)既想達(dá)到reset的效果,又想有記錄防止反悔,那這。。。是一個(gè)值得思考的問(wèn)題!
git reset和revert區(qū)別的總結(jié):
reset是徹底回退到指定的commit版本,該commit后的所有commit都將被清除,包括提交歷史記錄;
revert僅僅是撤銷(xiāo)指定commit的修改,并不影響后續(xù)的commit,但所撤銷(xiāo)的commit被后續(xù)的commit修改了同一地方則會(huì)產(chǎn)生沖突;
reset執(zhí)行后不會(huì)產(chǎn)生記錄,revert執(zhí)行后會(huì)產(chǎn)生記錄;
reset執(zhí)行后無(wú)法再次恢復(fù),revert執(zhí)行后因?yàn)椴粫?huì)清除記錄,并且會(huì)產(chǎn)生新紀(jì)錄,所以文件不會(huì)丟失,你可以多次執(zhí)行revert恢復(fù)到某次改變之前的狀態(tài);
reset執(zhí)行后HEAD會(huì)后移,而revert的HEAD則一直是向前的;
理清了reset和revert的基本原理,你就明白了在什么時(shí)間該使用哪個(gè)命令更為合適了!
小提示:在IDEA開(kāi)發(fā)工具中,選中一個(gè)文件,右鍵git選項(xiàng)中會(huì)發(fā)現(xiàn)有一個(gè)Rollback:
這里需要跟reset和revert區(qū)分一下,rollback并不屬于git命令,它的作用是,在文件或代碼修改后,但還未commit,想恢復(fù)到與遠(yuǎn)程倉(cāng)庫(kù)代碼一致的狀態(tài),便可以執(zhí)行rollback操作!
關(guān)于“git中reset和revert的區(qū)別有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。