區別:1、reset是徹底回退到指定的commit版本,該commit后的所有commit都將被清除;而revert僅是撤銷指定commit的修改,并不影響后續的commit。2、reset執行后不會產生記錄,revert執行后會產生記錄。
git是我們常用的版本管理工具,我們團隊在合作開發項目時,時常會因為代碼及文件的修改提交,導致各種各樣的沖突,還有產品需求的頻繁變更,致使我們不得不做出回退版本,撤回提交這樣的決定,那么此時,reset和revert命令,就派上了用場!
reset,revert都有撤銷、回退的意思,但卻各有千秋,區別還是很大的,所以該使用哪種命令一定要結合實際情況來決定,本文就是帶大家搞清楚兩者的區別,然后能準確快速的使用正確的命令去解決實際問題!
下面的例子中,我有3次提交:初始狀態,只有readme一個文件,內容為Creatinganewbranchisquick.t1提交后狀態:只有readme一個文件,內容修改為Creatinganewbranchisquick1.t2提交后狀態:只有readme一個文件,內容修改為Creatinganewbranchisquick12.t3提交后狀態:新增了test文件.
本文以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文件,進行第三次提交:
好了,現在產品需求變更了,新增的功能(readme的第二次修改和新增的test文件)不需要了,要求回退到第一次提交“t1”,如果我們選擇使用reset:
首先定位到t1的commit,可以從遠程倉庫提交歷史記錄中復制,也可以用命令git log
查看:
(小提示,如果最后一行出現“:”,則輸入wq退出回到命令行即可!)
復制commit,執行命令:
gitreset--hard8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2
提示,HEAD已經指向了t1,但你刷新后臺時,發現并沒有什么變化,這是因為我們還需要執行一下push,但這里需要注意的是,因為本地代碼回到了舊版本,但遠程倉庫是新版本和本地不一致,所以你在用git push時會報錯,這里我們需要使用強制提交,git push -f
,我們也可以使用git status
查看當前狀態:
意思是告訴你,遠程倉庫代碼較新,需要你執行 git pull
操作以同步代碼,但這并不是我們的需求,所以我們不用理會,執行,git push -f
:
再看倉庫:
歷史記錄只剩下了t1:
readme內容也得到了恢復:
可見,reset是徹徹底底的回退,該commit之后的所有修改將完全消失,包括提交記錄。
優點:
徹底回退到指定版本,干凈清爽;
提交時間線清晰,沒有冗雜;
缺點:
記錄徹底清除,無法再次恢復;
再說revert:
revert執行后會產生新的commit記錄,是通過一次新的commit來恢復到之前舊的commit,但revert會保留恢復的該次提交后面的其它提交內容,假如后面的提交與要恢復的提交更改了同一地方,此時用revert就會產生沖突!
我們繼續以上面的例子為例,我重新執行了t2和t3提交,恢復到reset之前的狀態:
此時,我們按reset的思路,使用revert恢復到t1,執行命令:
gitrevert8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2
報錯:
提示沖突了?讓我們解決掉沖突后提交…
<<<<<<<HEADCreatinganewbranchisquick12.=======Creatinganewbranchisquick.>>>>>>>parentof8cbf16c(t1)
上面的沖突表示,當前的內容是:
Creatinganewbranchisquick12.
而我們要恢復的內容是:
Creatinganewbranchisquick.
如果對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
:
gitrevertfc4889dcb327cff9f8078db6a0d5c601b8e91ae9
執行后會自動進入編輯界面:
這里需要我們修改或輸入提交日志,按 “i”,進入輸入狀態,寫完后按ESC退出輸入狀態,再按“:wq”退出!
成功后,執行 git push:
查看倉庫后臺:
項目目錄:
readme內容:
可見,revert操作成功后,產生了新的commit記錄,t2對t1的修改已經恢復,現在的readme就是t1提交后的狀態,但同時test文件仍然存在,即t3的提交不受影響!
但如果你說,想要和reset一樣,把t2t3的提交也要刪除掉,那你就先revert t3,再revert t2,可以達到同樣的效果,但這樣一來,為何不直接用reset?如果你說既想達到reset的效果,又想有記錄防止反悔,那這。。。是一個值得思考的問題!
git reset和revert區別的總結:
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操作!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
什么是儲蓄業務?儲蓄是指每個人或家庭,把節約的錢存到銀行的經濟活動。城鄉居民將暫時不用或結余的貨幣收入存入銀行或其他金融機構的一種存款活動。又稱儲蓄存款。儲蓄存款是信用機構的一項重要資金來源。很多客戶到銀行,存儲資金時會了解銀行的一些儲蓄業務,比如對個人儲蓄業務的了解就是比較熱門的一個話題。1.個人儲蓄業務的范圍比較廣,它不僅包括儲蓄者到銀行辦理的活期存款儲蓄,而且還有很多的類別可以供儲蓄者選擇。...
網易理財的現金寶產品有風險嗎?現金寶是網易理財平臺精選的合作方提供的一款具有較高收益且保證資金隨取隨用的貨幣基金產品,貨幣市場基金是證券投資基金中的低風險品種,歷史上未曾出現負收益情況。網易現金寶是互聯網公司網易和知名的基金公司匯添富基金合作推出的理財產品,購買后即可享受貨幣基金收益。一分錢起存。收益高于銀行活期存款,又具有很好的流動性,隨取隨用,支持7*24小時申請即時取現,取現資金實時到賬。和...
紅籌股回歸是什么意思?紅籌股回歸指的是在中國境外注冊、在香港上市的帶有中國大陸概念的股票。這些股票想轉回大陸A股上市,就稱作紅籌股回歸,紅籌股回歸為紅籌股回歸A股。紅籌股為什么要回歸?紅籌股回歸A股的意義1、圈錢,誰都不會嫌錢多。2、市場在國內,回歸可以獲得國內廣大投資者的認同,股價比在香港更高。3、獲得更大的知名度,能上市本身就是巨大無形的廣告效應。4、希望回歸能讓國內的老百姓分享優質公司帶來的...