面試官:說說你對Git Reset 和 Git Revert 的理解?區(qū)別?
本文轉(zhuǎn)載自微信公眾號「JS每日一題」,作者灰灰 。轉(zhuǎn)載本文請聯(lián)系JS每日一題公眾號。
一、是什么
git reset
reset用于回退版本,可以遺棄不再使用的提交
執(zhí)行遺棄時,需要根據(jù)影響的范圍而指定不同的參數(shù),可以指定是否復(fù)原索引或工作樹內(nèi)容
git revert
在當(dāng)前提交后面,新增一次提交,抵消掉上一次提交導(dǎo)致的所有變化,不會改變過去的歷史,主要是用于安全地取消過去發(fā)布的提交
二、如何用
git reset
當(dāng)沒有指定ID的時候,默認使用HEAD,如果指定ID,那么就是基于指向ID去變動暫存區(qū)或工作區(qū)的內(nèi)容
- // 沒有指定ID, 暫存區(qū)的內(nèi)容會被當(dāng)前ID版本號的內(nèi)容覆蓋,工作區(qū)不變
- git reset
- // 指定ID,暫存區(qū)的內(nèi)容會被指定ID版本號的內(nèi)容覆蓋,工作區(qū)不變
- git reset <ID>
日志ID可以通過查詢,可以git log進行查詢,如下:
- commit a7700083ace1204ccdff9f71631fb34c9913f7c5 (HEAD -> master)
- Author: linguanghui <linguanghui@baidu.com>
- Date: Tue Aug 17 22:34:40 2021 +0800
- second commit
- commit e31118663ce66717edd8a179688a7f3dde5a9393
- Author: linguanghui <linguanghui@baidu.com>
- Date: Tue Aug 17 22:20:01 2021 +0800
- first commit
常見命令如下:
- --mixed(默認):默認的時候,只有暫存區(qū)變化
- --hard參數(shù):如果使用 --hard 參數(shù),那么工作區(qū)也會變化
- --soft:如果使用 --soft 參數(shù),那么暫存區(qū)和工作區(qū)都不會變化
git revert
跟git reset用法基本一致,git revert 撤銷某次操作,此次操作之前和之后的 commit和history都會保留,并且把這次撤銷,作為一次最新的提交,如下:
- git revert <commit_id>
如果撤銷前一個版本,可以通過如下命令:
- git revert HEAD
撤銷前前一次,如下:
- git revert HEAD^
三、區(qū)別
撤銷(revert)被設(shè)計為撤銷公開的提交(比如已經(jīng)push)的安全方式,git reset被設(shè)計為重設(shè)本地更改
因為兩個命令的目的不同,它們的實現(xiàn)也不一樣:重設(shè)完全地移除了一堆更改,而撤銷保留了原來的更改,用一個新的提交來實現(xiàn)撤銷
兩者主要區(qū)別如下:
- git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit
- git reset 是把HEAD向后移動了一下,而git revert是HEAD繼續(xù)前進,只是新的commit的內(nèi)容和要revert的內(nèi)容正好相反,能夠抵消要被revert的內(nèi)容
- 在回滾這一操作上看,效果差不多。但是在日后繼續(xù) merge 以前的老版本時有區(qū)別
git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch時,之前提交合并的代碼仍然存在,導(dǎo)致不能夠重新合并
但是git reset是之間把某些commit在某個branch上刪除,因而和老的branch再次merge時,這些被回滾的commit應(yīng)該還會被引入
如果回退分支的代碼以后還需要的情況則使用git revert, 如果分支是提錯了沒用的并且不想讓別人發(fā)現(xiàn)這些錯誤代碼,則使用git reset
參考文獻
https://juejin.cn/post/6844903542931587086
https://marklodato.github.io/visual-git-guide/index-zh-cn.html#reset