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