git中reset和revert的區別是什么

區別:1、reset是徹底回退到指定的commit版本,該commit后的所有commit都將被清除;而revert僅是撤銷指定commit的修改,并不影響后續的commit。2、reset執行后不會產生記錄,revert執行后會產生記錄。

git中reset和revert的區別是什么

本教程操作環境:Windows7系統、git2.30.0版、Dell G3電腦。

git是我們常用的版本管理工具,我們團隊在合作開發項目時,時常會因為代碼及文件的修改提交,導致各種各樣的沖突,還有產品需求的頻繁變更,致使我們不得不做出回退版本,撤回提交這樣的決定,那么此時,reset和revert命令,就派上了用場!

reset,revert都有撤銷、回退的意思,但卻各有千秋,區別還是很大的,所以該使用哪種命令一定要結合實際情況來決定,本文就是帶大家搞清楚兩者的區別,然后能準確快速的使用正確的命令去解決實際問題!

下面的例子中,我有3次提交: 初始狀態,只有readme一個文件,內容為Creating?a?new?branch?is?quick. t1提交后狀態:只有readme一個文件,內容修改為Creating?a?new?branch?is?quick?1. t2提交后狀態:只有readme一個文件,內容修改為Creating?a?new?branch?is?quick?1?2. t3提交后狀態:新增了test文件.

本文以git bash為例:

git中reset和revert的區別是什么
先說reset

reset,使用方法:git reset –hard commit ,commit是提交后產生的SHA1,執行該命令后,代碼會完全回退到本次提交時的狀態,工作暫存區以及本次提交后面的提交內容將會被完全清除,包括提交記錄!

舉例:

原項目,包含一個Readme.txt文件:
git中reset和revert的區別是什么
文件內容:
git中reset和revert的區別是什么
此時我將修改文件內容為:

Creating a new branch is quick 1.

進行第一次提交
git中reset和revert的區別是什么
提交記錄:
git中reset和revert的區別是什么
提交后的遠程倉庫目錄及文件內容:

git中reset和revert的區別是什么git中reset和revert的區別是什么
沒有問題,繼續修改文件內容:Creating a new branch is quick 1 2. ,進行第二次提交
git中reset和revert的區別是什么
現在我將新增一個test文件,進行第三次提交
git中reset和revert的區別是什么
git中reset和revert的區別是什么git中reset和revert的區別是什么

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

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

git中reset和revert的區別是什么
(小提示,如果最后一行出現“:”,則輸入wq退出回到命令行即可!)

復制commit,執行命令:

git?reset?--hard?8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2

git中reset和revert的區別是什么

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

git中reset和revert的區別是什么

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

git中reset和revert的區別是什么

再看倉庫:

git中reset和revert的區別是什么

歷史記錄只剩下了t1:

git中reset和revert的區別是什么

readme內容也得到了恢復:

git中reset和revert的區別是什么

可見,reset是徹徹底底的回退,該commit之后的所有修改將完全消失,包括提交記錄。

優點

  • 徹底回退到指定版本,干凈清爽;
  • 提交時間線清晰,沒有冗雜;

缺點

  • 記錄徹底清除,無法再次恢復;

再說revert

revert執行后會產生新的commit記錄,是通過一次新的commit來恢復到之前舊的commit,但revert會保留恢復的該次提交后面的其它提交內容,假如后面的提交與要恢復的提交更改了同一地方,此時用revert就會產生沖突!

我們繼續以上面的例子為例,我重新執行了t2和t3提交,恢復到reset之前的狀態:

git中reset和revert的區別是什么
git中reset和revert的區別是什么
此時,我們按reset的思路,使用revert恢復到t1,執行命令:

git?revert?8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2

報錯:

git中reset和revert的區別是什么
提示沖突了?讓我們解決掉沖突后提交…

>>>>>>?parent?of?8cbf16c?(t1)

上面的沖突表示,當前的內容是:

Creating?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

執行后會自動進入編輯界面:

git中reset和revert的區別是什么

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

成功后,執行 git push:

git中reset和revert的區別是什么

查看倉庫后臺:

git中reset和revert的區別是什么

項目目錄:

git中reset和revert的區別是什么

readme內容:

git中reset和revert的區別是什么

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

git中reset和revert的區別是什么
這里需要跟reset和revert區分一下,rollback并不屬于git命令,它的作用是,在文件或代碼修改后,但還未commit,想恢復到與遠程倉庫代碼一致的狀態,便可以執行rollback操作!

推薦學習:《Git教程

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享