溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

git中reset和revert的區(qū)別有哪些

發(fā)布時間:2023-03-17 17:26:34 來源:億速云 閱讀:146 作者:iii 欄目:軟件技術(shù)

這篇文章主要介紹“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為例:

git中reset和revert的區(qū)別有哪些

先說reset

reset,使用方法:git reset --hard commit ,commit是提交后產(chǎn)生的SHA1,執(zhí)行該命令后,代碼會完全回退到本次提交時的狀態(tài),工作暫存區(qū)以及本次提交后面的提交內(nèi)容將會被完全清除,包括提交記錄!

舉例:

原項目,包含一個Readme.txt文件:
git中reset和revert的區(qū)別有哪些

文件內(nèi)容:
git中reset和revert的區(qū)別有哪些

此時我將修改文件內(nèi)容為:

Creating a new branch is quick 1.

進(jìn)行第一次提交
git中reset和revert的區(qū)別有哪些

提交記錄:
git中reset和revert的區(qū)別有哪些

提交后的遠(yuǎn)程倉庫目錄及文件內(nèi)容:

git中reset和revert的區(qū)別有哪些
沒有問題,繼續(xù)修改文件內(nèi)容:Creating a new branch is quick 1 2. ,進(jìn)行第二次提交
git中reset和revert的區(qū)別有哪些

現(xiàn)在我將新增一個test文件,進(jìn)行第三次提交
git中reset和revert的區(qū)別有哪些

git中reset和revert的區(qū)別有哪些

好了,現(xiàn)在產(chǎn)品需求變更了,新增的功能(readme的第二次修改和新增的test文件)不需要了,要求回退到第一次提交“t1”,如果我們選擇使用reset:

首先定位到t1的commit,可以從遠(yuǎn)程倉庫提交歷史記錄中復(fù)制,也可以用命令git log查看:

git中reset和revert的區(qū)別有哪些

(小提示,如果最后一行出現(xiàn)“:”,則輸入wq退出回到命令行即可?。?/em>

復(fù)制commit,執(zhí)行命令:

git reset --hard 8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2

git中reset和revert的區(qū)別有哪些

提示,HEAD已經(jīng)指向了t1,但你刷新后臺時,發(fā)現(xiàn)并沒有什么變化,這是因為我們還需要執(zhí)行一下push,但這里需要注意的是,因為本地代碼回到了舊版本,但遠(yuǎn)程倉庫是新版本和本地不一致,所以你在用git push時會報錯,這里我們需要使用強制提交,git push -f,我們也可以使用git status查看當(dāng)前狀態(tài):

git中reset和revert的區(qū)別有哪些

意思是告訴你,遠(yuǎn)程倉庫代碼較新,需要你執(zhí)行 git pull操作以同步代碼,但這并不是我們的需求,所以我們不用理會,執(zhí)行,git push -f

git中reset和revert的區(qū)別有哪些

再看倉庫:

git中reset和revert的區(qū)別有哪些

歷史記錄只剩下了t1:

git中reset和revert的區(qū)別有哪些

readme內(nèi)容也得到了恢復(fù):

git中reset和revert的區(qū)別有哪些

可見,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):

git中reset和revert的區(qū)別有哪些

此時,我們按reset的思路,使用revert恢復(fù)到t1,執(zhí)行命令:

git revert 8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2

報錯:

git中reset和revert的區(qū)別有哪些

提示沖突了?讓我們解決掉沖突后提交…

<<<<<<< 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)入編輯界面:

git中reset和revert的區(qū)別有哪些

這里需要我們修改或輸入提交日志,按 “i”,進(jìn)入輸入狀態(tài),寫完后按ESC退出輸入狀態(tài),再按“:wq”退出!

成功后,執(zhí)行 git push:

git中reset和revert的區(qū)別有哪些

查看倉庫后臺:

git中reset和revert的區(qū)別有哪些

項目目錄:

git中reset和revert的區(qū)別有哪些

readme內(nèi)容:

git中reset和revert的區(qū)別有哪些

可見,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

git中reset和revert的區(qū)別有哪些

這里需要跟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è)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細(xì)節(jié)

免責(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)容。

AI