Git撤銷命令revert與reset區(qū)別全面對比
前言
今天有同事問我Git的撤銷命令revert與reset有什么區(qū)別?特意整理了一下,做個(gè)比較全面的對比??傮w來說,git revert 和 git reset 都是用于撤銷更改的 Git 命令,但它們的工作方式和用途都有顯著區(qū)別。
核心區(qū)別對比
| 特性 | git revert | git reset |
|---|---|---|
| 安全性 | 安全 - 不改變歷史記錄 | 危險(xiǎn) - 會修改歷史記錄 |
| 操作對象 | 提交(commit) | 提交(commit)或暫存區(qū) |
| 歷史記錄 | 創(chuàng)建新的撤銷提交 | 刪除/移動提交歷史 |
| 團(tuán)隊(duì)協(xié)作 | 適合共享倉庫 | 不適合已推送的提交 |
| 工作區(qū)影響 | 不影響未提交的更改 | 根據(jù)模式影響工作區(qū) |
詳細(xì)說明
git revert
作用:創(chuàng)建一個(gè)新的提交來撤銷指定提交的更改
使用場景:撤銷已推送到遠(yuǎn)程倉庫的提交
命令示例:
# 撤銷最近一次提交 git revert HEAD # 撤銷指定提交 git revert <commit-hash> # 撤銷多個(gè)連續(xù)提交 git revert <oldest-commit>..<latest-commit>
特點(diǎn):
歷史記錄中會保留原提交和新創(chuàng)建的撤銷提交
可以撤銷任意歷史提交,而不影響后續(xù)提交
適合團(tuán)隊(duì)協(xié)作環(huán)境
git reset
作用:將當(dāng)前分支重置到指定狀態(tài),有三種模式
三種模式對比:
| 模式 | 工作區(qū) | 暫存區(qū) | 歷史記錄 | 適用場景 |
|---|---|---|---|---|
| --soft | 不變 | 保留更改 | 回退 | 修改提交信息 |
| --mixed (默認(rèn)) | 不變 | 清空 | 回退 | 重新組織提交 |
| --hard | 清空 | 清空 | 回退 | 徹底放棄更改 |
命令示例:
# 重置到前一個(gè)提交(保留工作區(qū)更改,取消暫存) git reset HEAD~1 # 重置并保留更改在暫存區(qū) git reset --soft HEAD~1 # 徹底重置,丟棄所有更改 git reset --hard HEAD~1 # 重置到特定提交 git reset --hard <commit-hash>
使用建議
使用git revert當(dāng):
撤銷已推送到遠(yuǎn)程倉庫的提交
需要保留完整的歷史記錄
多人協(xié)作,避免影響他人工作
只想撤銷某個(gè)特定提交,而保留后續(xù)更改
使用git reset當(dāng):
撤銷本地未推送的提交
需要重寫本地歷史(如整理提交記錄)
完全放棄某些本地更改
注意:如果提交已推送,需要強(qiáng)制推送(
git push -f),這會破壞團(tuán)隊(duì)協(xié)作(且強(qiáng)制推送后會抹掉git倉庫中原來的提交記錄)
實(shí)際示例
# 錯(cuò)誤提交了不該提交的文件,但已推送到遠(yuǎn)程 # ? 正確做法:使用 revert git revert HEAD git push # 本地提交了錯(cuò)誤信息,還未推送 # ? 正確做法:使用 reset git reset --soft HEAD~1 # 修改文件后重新提交 git add . git commit -m "正確的提交信息" # 想完全放棄最近的本地更改 # ? 使用 hard reset(謹(jǐn)慎?。? git reset --hard HEAD # reset 后必須使用 -f 強(qiáng)制push才能推送成功 git push -f
重要原則:
已推送的提交:總是使用
revert未推送的本地提交:可以使用
reset未跟蹤的本地更改:使用
git checkout -- <file>或git clean
記住這個(gè)簡單規(guī)則:公共歷史用 revert,私有歷史用 reset。
總結(jié)
- reset是徹底回退到指定的commit版本,該commit后的所有commit都將被清除,包括提交歷史記錄;
- revert僅僅是撤銷指定commit的修改,并不影響后續(xù)的commit,但所撤銷的commit被后續(xù)的commit修改了同一地方則會產(chǎn)生沖突;
- reset執(zhí)行后不會產(chǎn)生記錄,revert執(zhí)行后會產(chǎn)生記錄;
- reset執(zhí)行后無法再次恢復(fù),revert執(zhí)行后因?yàn)椴粫宄涗?,并且會產(chǎn)生新紀(jì)錄,所以文件不會丟失,你可以多次執(zhí)行revert恢復(fù)到某次改變之前的狀態(tài);
- reset執(zhí)行后HEAD會后移,而revert的HEAD則一直是向前的;
理清了reset和revert的基本原理,你就明白了在什么時(shí)間該使用哪個(gè)命令更為合適了!
到此這篇關(guān)于Git撤銷命令revert與reset區(qū)別全面對比的文章就介紹到這了,更多相關(guān)Git撤銷命令revert與reset區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
git add -A 和 git add . 的區(qū)別詳解
這篇文章主要介紹了git add -A 和 git add . 的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
OpenAI?函數(shù)調(diào)用示例及功能入門教程
這篇文章主要為大家介紹了OpenAI?函數(shù)調(diào)用示例及功能入門教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
關(guān)于大型頁游后端管理系統(tǒng)的一點(diǎn)經(jīng)驗(yàn)和個(gè)人見解
做過游戲開發(fā)的人都知道,端游可以用c++,頁游可以用sl或者as3,鑒于這段時(shí)間一直在看網(wǎng)頁游戲開發(fā)的知識,所以關(guān)于游戲開發(fā),我有一點(diǎn)自己的見解2012-06-06

