git中reset和revert區(qū)別小結(jié)
1. 案例
線上master分支不可信,需要回到某個分支;
但是很多人習(xí)慣把一個需求,分多次commit,于是會出現(xiàn)下面這種情況

基于這種情況,git revert 就不如 git reset好用,可以借助Idea,直接通過 git reset --hard 指向需要回退到的commit,然后隨便找個地方,敲上一個空格,產(chǎn)生一次新的commit id,即可達(dá)到效果;


2. git的 reset 和 revert 有啥區(qū)別?
2.1 問題背景
在某一次的上線中,發(fā)現(xiàn)有的同學(xué),上線之后發(fā)現(xiàn)master 分支存在bug,線上回滾之后,在處理git倉庫回滾分支時,因分不清reset(重置)、revert(恢復(fù)) 兩者的區(qū)別,使用git reset回退之后,再與master merge時,發(fā)現(xiàn)master無變化,因?yàn)樽鳛榇舜我氚咐?,分享一波?/p>
先簡單說一下,在提交到遠(yuǎn)程庫之前我們使用git reset 命令完全可以滿足我們 撤銷操作的需求,如果操作已經(jīng)提交到遠(yuǎn)程庫,那只好使用 git revert 來提交一個新的撤銷操作 撤銷 需要撤銷的那次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)程端時,文件的提交需要經(jīng)過git add、git commit及git push三個過程才能提交至git遠(yuǎn)程倉庫。
我們平時修改文件在工作目錄中,提交時先使用git add提交至?xí)捍鎱^(qū),再通過git commit提交至本地倉庫,最后才能使用git push提交至遠(yuǎn)程倉庫。
2.2.1 在工作區(qū)的代碼
git checkout -- . # 丟棄全部
注意:git checkout – . 丟棄全部,也包括:新增的文件會被刪除、刪除的文件會恢復(fù)回來、修改的文件會回去。這幾個前提都說的是,回到暫存區(qū)之前的樣子。對之前保存在暫存區(qū)里的代碼不會有任何影響。對commit提交到本地分支的代碼就更沒影響了。當(dāng)然,如果你之前壓根都沒有暫存或commit,那就是回到你上次pull下來的樣子了。
2.2.2 代碼git add到緩存區(qū),并未commit提交
git reset HEAD . 或者 git reset HEAD a.txt
這個命令僅改變暫存區(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> # 回到其中你想要的某個版 或者 git reset --hard HEAD^ # 回到最新的一次提交 或者 git reset HEAD^ # 此時代碼保留,回到 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)制提交一次,之前錯誤的提交就從遠(yuǎn)程倉庫刪除
2.2.4.2 通過git revert是用一次新的commit來回滾之前的commit
git log # 得到你需要回退一次提交的commit id git revert <commit_id> # 撤銷指定的版本,撤銷也會作為一次提交進(jìn)行保存 git commit -m "......." git push
2.3 reset
git reset中有三個命令(–hard、–soft與–mixed);主要用于工作區(qū)、暫存區(qū)、本地倉庫三個區(qū)域的文件提交撤回
git reset --hard xxx
hard (修改版本庫,修改暫存區(qū),修改工作區(qū))
- –hard HEAD~1 (或是版本號)意為將版本庫回退1個版本,但是不僅僅是將本地版本庫的頭指針全部重置到指定版本,也會重置暫存區(qū),并且會將工作區(qū)代碼也回退到這個版本;
git reset --soft xxx
soft (修改版本庫,保留暫存區(qū),保留工作區(qū))
- –soft HEAD~1 意為將版本庫軟回退1個版本,所謂軟回退表示將本地版本庫的頭指針全部重置到指定版本,且將這次提交之后的所有變更都移動到暫存區(qū)。
2.4 revert
git revert xxx
– git revert 也是撤銷命令,區(qū)別在于reset是指向原地或者向前移動指針,git revert是創(chuàng)建一個commit來覆蓋當(dāng)前的commit,指針向后移動。
2.5 git revert 和 git reset的區(qū)別
- git revert是用一次新的commit來回滾之前的commit,此次提交之前的commit都會被保留;
- git reset是回到某次提交,提交及之前的commit都會被保留,但是此commit id之后的修改都會被刪除;
- git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit。
- 在回滾這一操作上看,效果差不多。但是在日后繼續(xù)merge以前的老版本時有區(qū)別。因?yàn)間it revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch時,導(dǎo)致這部分改變不會再次出現(xiàn),但是git reset是之間把某些commit在某個branch上刪除,因而和老的branch再次merge時,這些被回滾的commit應(yīng)該還會被引入。
- git reset 是把HEAD向后移動了一下,而git revert是HEAD繼續(xù)前進(jìn),只是新的commit的內(nèi)容和要revert的內(nèi)容正好相反,能夠抵消要被revert的內(nèi)容。
通俗易懂的說呢,就是git revert 是回滾當(dāng)前此次的commit,回到上一個狀態(tài),就好比咱們習(xí)慣性用的Ctrl+z; 而git reset 是回到歷史某個版本,它的commit是舊的,是歷史的,而git revert 會產(chǎn)生新的commit,就這么回事
到此這篇關(guān)于git中reset和revert區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)git reset revert內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual Studio和Visual Studio Code之間有什么區(qū)別
本文給大家介紹的是Visual Studio和Visual Studio Code之間有什么區(qū)別,希望對大家的學(xué)習(xí)能夠有所幫助2020-02-02
git修改已commit的注釋信息實(shí)現(xiàn)
這篇文章主要介紹了git修改已commit的注釋信息實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
VSCode設(shè)置網(wǎng)頁代碼實(shí)時預(yù)覽的實(shí)現(xiàn)
這篇文章主要介紹了VSCode設(shè)置網(wǎng)頁代碼實(shí)時預(yù)覽的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
scratch-www 在Win10下的環(huán)境搭建詳細(xì)教程
scratch-www是scratch-gui的網(wǎng)頁版,功能包括gui的編輯,保存,播放,和gui的作品展示,這里主要介紹scratch-www在window系統(tǒng)下的安裝和運(yùn)行,感興趣的朋友跟隨小編一起看看吧2021-08-08

