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ū)之前的樣子。對之前保存在暫存區(qū)里的代碼不會(huì)有任何影響。對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 (或是版本號)意為將版本庫回退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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
寫給正在讀計(jì)算機(jī)專業(yè)的同學(xué) 該如何學(xué)習(xí)
現(xiàn)在IT新技術(shù)日新月異。就常用編程語言而言,有c/c++、匯編、java,c#、Python等;操作系統(tǒng)平臺(tái)有unix/linux,windows系列2009-11-11
十分鐘內(nèi)學(xué)會(huì) 避免用戶刷新導(dǎo)致重復(fù)POST提交
在Web應(yīng)用中,采用POST提交信息是非常常見的,然而如果目標(biāo)頁面打開得太慢,用戶就可能會(huì)刷新頁面,這時(shí)候之前已經(jīng)提交過的信息就會(huì)被重復(fù)提交。2009-08-08
git?clone報(bào)錯(cuò)SSL?connect?error解決
這篇文章主要為大家介紹了git?clone報(bào)錯(cuò)SSL?connect?error解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Azkaban報(bào)錯(cuò)-azkaban.executor.ExecutorManagerException: No acti
這篇文章主要介紹了Azkaban報(bào)錯(cuò)-azkaban.executor.ExecutorManagerException: No active executors found,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-05-05
vs2019生成dll并調(diào)用的實(shí)現(xiàn)示例
這篇文章主要介紹了vs2019生成dll并調(diào)用的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
Win10環(huán)境下?編譯?和?運(yùn)行?x264的詳細(xì)過程
這篇文章主要介紹了Win10環(huán)境下編譯和運(yùn)行x264的詳細(xì)過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
Git多人協(xié)同開發(fā)緊急修復(fù)線上bug操作指南
這篇文章主要為大家介紹了Git多人協(xié)同開發(fā)緊急修復(fù)線上bug操作指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

