git中reset和revert區(qū)別小結(jié)
1. 案例
線上master分支不可信,需要回到某個(gè)分支;
但是很多人習(xí)慣把一個(gè)需求,分多次commit,于是會(huì)出現(xiàn)下面這種情況
基于這種情況,git revert 就不如 git reset好用,可以借助Idea,直接通過 git reset --hard 指向需要回退到的commit,然后隨便找個(gè)地方,敲上一個(gè)空格,產(chǎn)生一次新的commit id,即可達(dá)到效果;
2. git的 reset 和 revert 有啥區(qū)別?
2.1 問題背景
在某一次的上線中,發(fā)現(xiàn)有的同學(xué),上線之后發(fā)現(xiàn)master 分支存在bug,線上回滾之后,在處理git倉庫回滾分支時(shí),因分不清reset(重置)
、revert(恢復(fù))
兩者的區(qū)別,使用git reset回退之后,再與master merge時(shí),發(fā)現(xiàn)master無變化,因?yàn)樽鳛榇舜我氚咐?,分享一波?/p>
先簡單說一下,在提交到遠(yuǎn)程庫之前我們使用git reset 命令完全可以滿足我們 撤銷操作的需求,如果操作已經(jīng)提交到遠(yuǎn)程庫,那只好使用 git revert 來提交一個(gè)新的撤銷操作 撤銷 需要撤銷的那次commit
。
2.2 git的工作流
工作區(qū)
:即自己當(dāng)前分支所修改的代碼,git add xx 之前的!不包括 git add xx 和 git commit xxx 之后的。暫存區(qū)
:已經(jīng) git add xxx 進(jìn)去,且未 git commit xxx 的。本地分支
:已經(jīng)git commit -m xxx 提交到本地分支的。
在將文件提交至遠(yuǎn)程端時(shí),文件的提交需要經(jīng)過git add、git commit及git push三個(gè)過程才能提交至git遠(yuǎn)程倉庫。
我們平時(shí)修改文件在工作目錄中,提交時(shí)先使用git add提交至?xí)捍鎱^(qū),再通過git commit提交至本地倉庫,最后才能使用git push提交至遠(yuǎn)程倉庫。
2.2.1 在工作區(qū)的代碼
git checkout -- . # 丟棄全部
注意:git checkout – . 丟棄全部,也包括:新增的文件會(huì)被刪除、刪除的文件會(huì)恢復(fù)回來、修改的文件會(huì)回去。這幾個(gè)前提都說的是,回到暫存區(qū)之前的樣子。對(duì)之前保存在暫存區(qū)里的代碼不會(huì)有任何影響。對(duì)commit提交到本地分支的代碼就更沒影響了。當(dāng)然,如果你之前壓根都沒有暫存或commit,那就是回到你上次pull下來的樣子了。
2.2.2 代碼git add到緩存區(qū),并未commit提交
git reset HEAD . 或者 git reset HEAD a.txt
這個(gè)命令僅改變暫存區(qū),并不改變工作區(qū),這意味著在無任何其他操作的情況下,工作區(qū)中的實(shí)際文件同該命令運(yùn)行之前無任何變化
2.2.3 git commit到本地分支、但沒有g(shù)it push到遠(yuǎn)程
git log # 得到你需要回退一次提交的commit id git reset --hard <commit_id> # 回到其中你想要的某個(gè)版 或者 git reset --hard HEAD^ # 回到最新的一次提交 或者 git reset HEAD^ # 此時(shí)代碼保留,回到 git add 之前
2.2.4 git push把修改提交到遠(yuǎn)程倉庫
2.2.4.1 通過git reset是直接刪除指定的commit
git log # 得到你需要回退一次提交的commit id git reset --hard <commit_id> git push origin HEAD --force # 強(qiáng)制提交一次,之前錯(cuò)誤的提交就從遠(yuǎn)程倉庫刪除
2.2.4.2 通過git revert是用一次新的commit來回滾之前的commit
git log # 得到你需要回退一次提交的commit id git revert <commit_id> # 撤銷指定的版本,撤銷也會(huì)作為一次提交進(jìn)行保存 git commit -m "......." git push
2.3 reset
git reset中有三個(gè)命令(–hard、–soft與–mixed);主要用于工作區(qū)、暫存區(qū)、本地倉庫三個(gè)區(qū)域的文件提交撤回
git reset --hard xxx
hard (修改版本庫,修改暫存區(qū),修改工作區(qū))
- –hard HEAD~1 (或是版本號(hào))意為將版本庫回退1個(gè)版本,但是不僅僅是將本地版本庫的頭指針全部重置到指定版本,也會(huì)重置暫存區(qū),并且會(huì)將工作區(qū)代碼也回退到這個(gè)版本;
git reset --soft xxx
soft (修改版本庫,保留暫存區(qū),保留工作區(qū))
- –soft HEAD~1 意為將版本庫軟回退1個(gè)版本,所謂軟回退表示將本地版本庫的頭指針全部重置到指定版本,且將這次提交之后的所有變更都移動(dòng)到暫存區(qū)。
2.4 revert
git revert xxx
– git revert 也是撤銷命令,區(qū)別在于reset是指向原地或者向前移動(dòng)指針,git revert是創(chuàng)建一個(gè)commit來覆蓋當(dāng)前的commit,指針向后移動(dòng)。
2.5 git revert 和 git reset的區(qū)別
- git revert是用一次新的commit來回滾之前的commit,此次提交之前的commit都會(huì)被保留;
- git reset是回到某次提交,提交及之前的commit都會(huì)被保留,但是此commit id之后的修改都會(huì)被刪除;
- git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit。
- 在回滾這一操作上看,效果差不多。但是在日后繼續(xù)merge以前的老版本時(shí)有區(qū)別。因?yàn)間it revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch時(shí),導(dǎo)致這部分改變不會(huì)再次出現(xiàn),但是git reset是之間把某些commit在某個(gè)branch上刪除,因而和老的branch再次merge時(shí),這些被回滾的commit應(yīng)該還會(huì)被引入。
- git reset 是把HEAD向后移動(dòng)了一下,而git revert是HEAD繼續(xù)前進(jìn),只是新的commit的內(nèi)容和要revert的內(nèi)容正好相反,能夠抵消要被revert的內(nèi)容。
通俗易懂的說呢,就是git revert 是回滾當(dāng)前此次的commit,回到上一個(gè)狀態(tài),就好比咱們習(xí)慣性用的Ctrl+z; 而git reset 是回到歷史某個(gè)版本,它的commit是舊的,是歷史的,而git revert 會(huì)產(chǎn)生新的commit,就這么回事
到此這篇關(guān)于git中reset和revert區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)git reset revert內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Istio?訪問外部服務(wù)流量控制最常用的5個(gè)技巧示例
這篇文章主要介紹了Istio訪問外部服務(wù)流量控制最常用5個(gè)技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06文章中優(yōu)酷視頻全屏及去除廣告在線轉(zhuǎn)換
很多網(wǎng)站發(fā)表了引用優(yōu)酷視頻不能全屏,或一點(diǎn)全屏又跳到官方網(wǎng)了,結(jié)果又要重新緩沖。用戶體驗(yàn)特別不好。2010-09-09GitLab使用外部提供的Redis緩存數(shù)據(jù)庫的方法詳解
這篇文章主要介紹了GitLab: 如何使用外部提供的Redis緩存數(shù)據(jù)庫,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09云開發(fā) VSCode 插件 Cloudbase Toolkit 的正確打開方式及應(yīng)用場景分析
Tencent CloudBase Toolkit 是云開發(fā)的 VS Code(Visual Studio Code)插件。這篇文章主要介紹了云開發(fā) VSCode 插件 Cloudbase Toolkit 的正確打開方式,需要的朋友可以參考下2020-07-07git提交驗(yàn)證規(guī)范并自動(dòng)生成日志文件的方法
這篇文章主要介紹了git提交驗(yàn)證規(guī)范并自動(dòng)生成日志文件的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11