Git撤銷命令revert與reset區(qū)別全面對比
前言
今天有同事問我Git的撤銷命令revert與reset有什么區(qū)別?特意整理了一下,做個比較全面的對比。總體來說,git revert 和 git reset 都是用于撤銷更改的 Git 命令,但它們的工作方式和用途都有顯著區(qū)別。
核心區(qū)別對比
| 特性 | git revert | git reset |
|---|---|---|
| 安全性 | 安全 - 不改變歷史記錄 | 危險 - 會修改歷史記錄 |
| 操作對象 | 提交(commit) | 提交(commit)或暫存區(qū) |
| 歷史記錄 | 創(chuàng)建新的撤銷提交 | 刪除/移動提交歷史 |
| 團隊協(xié)作 | 適合共享倉庫 | 不適合已推送的提交 |
| 工作區(qū)影響 | 不影響未提交的更改 | 根據模式影響工作區(qū) |
詳細說明
git revert
作用:創(chuàng)建一個新的提交來撤銷指定提交的更改
使用場景:撤銷已推送到遠程倉庫的提交
命令示例:
# 撤銷最近一次提交 git revert HEAD # 撤銷指定提交 git revert <commit-hash> # 撤銷多個連續(xù)提交 git revert <oldest-commit>..<latest-commit>
特點:
歷史記錄中會保留原提交和新創(chuàng)建的撤銷提交
可以撤銷任意歷史提交,而不影響后續(xù)提交
適合團隊協(xié)作環(huán)境
git reset
作用:將當前分支重置到指定狀態(tài),有三種模式
三種模式對比:
| 模式 | 工作區(qū) | 暫存區(qū) | 歷史記錄 | 適用場景 |
|---|---|---|---|---|
| --soft | 不變 | 保留更改 | 回退 | 修改提交信息 |
| --mixed (默認) | 不變 | 清空 | 回退 | 重新組織提交 |
| --hard | 清空 | 清空 | 回退 | 徹底放棄更改 |
命令示例:
# 重置到前一個提交(保留工作區(qū)更改,取消暫存) git reset HEAD~1 # 重置并保留更改在暫存區(qū) git reset --soft HEAD~1 # 徹底重置,丟棄所有更改 git reset --hard HEAD~1 # 重置到特定提交 git reset --hard <commit-hash>
使用建議
使用git revert當:
撤銷已推送到遠程倉庫的提交
需要保留完整的歷史記錄
多人協(xié)作,避免影響他人工作
只想撤銷某個特定提交,而保留后續(xù)更改
使用git reset當:
撤銷本地未推送的提交
需要重寫本地歷史(如整理提交記錄)
完全放棄某些本地更改
注意:如果提交已推送,需要強制推送(
git push -f),這會破壞團隊協(xié)作(且強制推送后會抹掉git倉庫中原來的提交記錄)
實際示例
# 錯誤提交了不該提交的文件,但已推送到遠程 # ? 正確做法:使用 revert git revert HEAD git push # 本地提交了錯誤信息,還未推送 # ? 正確做法:使用 reset git reset --soft HEAD~1 # 修改文件后重新提交 git add . git commit -m "正確的提交信息" # 想完全放棄最近的本地更改 # ? 使用 hard reset(謹慎!) git reset --hard HEAD # reset 后必須使用 -f 強制push才能推送成功 git push -f
重要原則:
已推送的提交:總是使用
revert未推送的本地提交:可以使用
reset未跟蹤的本地更改:使用
git checkout -- <file>或git clean
記住這個簡單規(guī)則:公共歷史用 revert,私有歷史用 reset。
總結
- reset是徹底回退到指定的commit版本,該commit后的所有commit都將被清除,包括提交歷史記錄;
- revert僅僅是撤銷指定commit的修改,并不影響后續(xù)的commit,但所撤銷的commit被后續(xù)的commit修改了同一地方則會產生沖突;
- reset執(zhí)行后不會產生記錄,revert執(zhí)行后會產生記錄;
- reset執(zhí)行后無法再次恢復,revert執(zhí)行后因為不會清除記錄,并且會產生新紀錄,所以文件不會丟失,你可以多次執(zhí)行revert恢復到某次改變之前的狀態(tài);
- reset執(zhí)行后HEAD會后移,而revert的HEAD則一直是向前的;
理清了reset和revert的基本原理,你就明白了在什么時間該使用哪個命令更為合適了!
到此這篇關于Git撤銷命令revert與reset區(qū)別全面對比的文章就介紹到這了,更多相關Git撤銷命令revert與reset區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
HTML5的<input>標簽的`type`屬性值詳解和代碼示例
HTML5的`<input>`標簽提供了多種`type`屬性值,用于創(chuàng)建不同類型的輸入控件,滿足用戶輸入的多樣化需求,從文本輸入、密碼輸入、多行文本輸入、單選按鈕、復選框、下拉選擇框、數值輸入、日期選擇、文件上傳到提交、重置、普通按鈕等,每種類型都有其特定的用途和使用場景2025-12-12
git如何從某個分支的指定歷史版本中創(chuàng)建新分支
這篇文章主要介紹了git如何從某個分支的指定歷史版本中創(chuàng)建新分支問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
完全卸載VSCode--解決卸載重新安裝后還有原來配置的問題(圖解)
這篇文章主要介紹了完全卸載VSCode--解決卸載重新安裝后還有原來配置的問題,本文給大家分享VSCode卸載不徹底的問題,需要的朋友可以參考下2020-04-04

