【Git】git的回退功能

Git 的回退功能非常強大,但因為有多個命令,初學者很容易混淆。我們來系統地梳理一下最核心的幾個“回退”指令:git resetgit revertgit restore

我會按照使用場景安全級別來為你講解。


核心區別:reset vs revert

這是最重要的區別,理解了它就理解了 Git 回退的精髓:

  • git reset (重置/回滾): 會修改提交歷史。它像一臺時間機器,直接把你的分支帶回到過去某個點,后面的歷史記錄就“消失”了。

    • 適用場景:只在你自己的本地分支上使用。因為會修改歷史,絕對不要在已經推送到遠程的公共分支(如 main, develop)上使用!
    • 危險性:較高,尤其是 --hard 模式。
  • git revert (撤銷/反轉): 不會修改歷史,而是創建一個新的提交來抵消掉某個舊的提交。它像是在賬本上寫一筆“負數”來沖銷之前的錯誤記錄,而不是撕掉那一頁。

    • 適用場景安全,適用于任何分支,尤其是已經推送到遠程的公共分支。這是團隊協作中推薦的回退方式。
    • 危險性:低。

1. git reset:強大的本地時間機器

git reset 主要用來回退未推送的本地提交。它有三種模式,決定了它對你的工作區和暫存區的影響。

假設你的提交歷史是 A -> B -> C,當前在 C (HEAD 指向 C)。現在你想回退到 B

git reset <commit-B-hash>
# 或者更常用的,回退到上一個版本
git reset HEAD~1 
三種模式:
  • --soft (溫柔模式)

    • 命令: git reset --soft HEAD~1
    • 效果:
      1. 提交歷史: 回退到 BC 的提交被撤銷。
      2. 暫存區 (Staging Area): 保留 C 提交時的所有更改,這些更改會處于“已暫存”狀態。
      3. 工作區 (Working Directory): 保留 C 提交時的所有代碼,文件內容不變。
    • 一句話總結:撤銷了提交,但保留了所有代碼更改并放在暫存區,你可以馬上重新提交。
    • 應用場景:“我剛才的提交信息寫錯了,或者漏了幾個文件,想把它們合并成一個新提交。”
  • --mixed (默認模式)

    • 命令: git reset HEAD~1 (不加參數時默認就是 --mixed)
    • 效果:
      1. 提交歷史: 回退到 B
      2. 暫存區: 清空C 提交時的更改被移出暫存區。
      3. 工作區: 保留 C 提交時的所有代碼,文件內容不變。
    • 一句話總結:撤銷了提交,也撤銷了 git add,但代碼還在。
    • 應用場景:“我剛才的提交不僅有問題,我還想重新檢查一下到底哪些文件需要提交。”
  • --hard (硬核/危險模式)

    • 命令: git reset --hard HEAD~1
    • 效果:
      1. 提交歷史: 回退到 B
      2. 暫存區: 清空
      3. 工作區: 代碼被丟棄。你的文件會完全恢復到 B 提交時的狀態。
    • 一句話總結:徹底抹除 C 提交的所有痕跡,包括代碼更改。
    • ?? 警告:這是一個破壞性操作!任何未提交的本地修改、以及 --hard 模式回退掉的提交內容,如果沒有備份,就很難找回了。
    • 應用場景:“我最近的幾次提交完全是垃圾,我想徹底扔掉它們,從頭再來。”

2. git revert:安全的企業級“撤銷”

當你發現一個已經推送到 main 分支的提交 C 引入了一個 Bug,你不能用 git reset,因為這會搞亂團隊其他成員的歷史。這時就該用 git revert

如何使用:

假設你要撤銷提交 C (commit-C-hash) 的更改。

git revert <commit-C-hash>
  • 效果:

    1. Git 會創建一個新的提交 D
    2. D 提交的內容,剛好是 C 提交內容的反向操作。比如 C 中添加了一行代碼,D 就會刪除那一行。
    3. 你的提交歷史會變成 A -> B -> C -> D
    4. Git 會自動打開編輯器讓你填寫這次撤銷操作的提交信息。
  • 一句話總結:用一次新的、正確的提交,來“糾正”一次舊的、錯誤的提交。

  • 應用場景:“線上代碼出 Bug 了,需要立刻回滾某個已經發布的提交,同時保持歷史記錄的清晰和團隊協作的穩定。”


3. git restore & git checkout --:撤銷工作區的修改

這兩個命令主要用于處理尚未提交的更改。

git restore 是較新的命令,語法更清晰,推薦使用。

場景一:撤銷對工作區文件的修改(還沒 git add

你不小心改亂了一個文件,想把它恢復到上次提交時的樣子。

# 新語法 (推薦)
git restore <file_name># 舊語法
git checkout -- <file_name>

效果file_name 在你工作區的修改會被丟棄,恢復成和暫存區/上次提交一樣的版本。

場景二:把文件從暫存區撤銷(已經 git add,但還沒 git commit

你用 git add 把一個不想提交的文件加到了暫存區。

# 新語法 (推薦)
git restore --staged <file_name># 舊語法
git reset HEAD <file_name>

效果:文件會從暫存區移除,但工作區的修改內容仍然保留


如何選擇:一個簡單的決策流程

  1. 這次回退需要影響公共歷史嗎?(即,代碼已 pushmain/develop

    • -> git revert (安全第一)
    • -> 繼續看第 2 步。
  2. 你想撤銷的是已經 commit 的提交嗎?

    • -> git reset
      • 想保留代碼并重新提交? -> reset --soft
      • 想保留代碼但重新暫存? -> reset --mixed
      • 想徹底丟掉代碼? -> reset --hard ??
    • (只是工作區或暫存區的修改) -> 繼續看第 3 步。
  3. 你想撤銷的是 git add 操作嗎?

    • -> git restore --staged <file>
    • (只是想丟棄文件的本地修改) -> git restore <file>

記住這個流程,你就能在各種場景下選擇最合適、最安全的回退指令了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88982.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88982.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88982.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32新建工程

1、新建工程 Keil5中&#xff0c;新建Project&#xff0c;選擇STM32Project文件夾&#xff0c;在此文件夾下新建一個文件夾“STM32工程模板”&#xff0c;然后給工程文件起名字“Project”選擇器件型號 2、添加啟動文件 新建start文件夾復制啟動文件&#xff1a;固件庫文件夾……

網絡傳輸過程

https傳輸過程客戶端發起HTTPS請求操作&#xff1a;用戶在瀏覽器輸入 https://www.example.com 技術細節&#xff1a; 客戶端向服務器443端口發起TCP連接 發送Client Hello消息&#xff08;包含支持的TLS版本、加密套件、客戶端隨機數&#xff09; 安全意義&#xff1a;建立安全…

【LeetCode 3440. 重新安排會議得到最多空余時間 II】解析

目錄LeetCode中國站原文原始題目題目描述示例1&#xff1a;示例2&#xff1a;示例3&#xff1a;示例4&#xff1a;講解1. 新規則&#xff0c;新挑戰2. 收益從何而來&#xff1f;兩種可能性的誕生3. 我們的終極策略4. 當策略被壓縮到極致第一次遍歷&#xff1a;從左到右&#xf…

C++卸載了會影響電腦正常使用嗎?解析C++運行庫的作用與卸載后果

卸載C運行庫可能導致常用軟件癱瘓&#xff01;這些不起眼的組件為Photoshop、游戲等提供關鍵支持&#xff0c;多個版本共存是正常現象&#xff0c;隨意清理會引發程序報錯甚至閃退。一、前言&#xff1a;C不是“編程語言”那么簡單很多用戶在電腦中看到“Microsoft Visual C Re…

前端vue對接海康攝像頭流程

1、拆包攝像頭、插電源2、下載SADP&#xff08;設備網絡搜索&#xff09;&#xff0c;連接設備&#xff0c;獲取ip地址 下載地址&#xff1a;https://partners.hikvision.com/tools 找到自己的設備類型DS開頭3、攝像頭鏈接wifi、網線 登錄設備預覽配置網頁-配置網絡-可預覽等 4…

org.casic.javafx.control.PaginationPicker用法

org.casic.javafx.control.PaginationPicker 是 CASIC&#xff08;或某位作者&#xff09;基于 JavaFX 自制的分頁控件&#xff0c;功能比官方 Pagination 更完整&#xff0c;支持&#xff1a;首頁 / 上一頁 / 下一頁 / 尾頁按鈕頁碼快速跳轉每頁條數自定義總數據量、當前頁碼、…

下載 | Win10 2021精簡版,預裝應用極少!(7月更新、Win 10 IoT LTSC 2021版、適合老電腦安裝)

? 【資源A047】Win10 IoT LTSC 2021精簡版 &#x1f536;Windows 10 IoT 企業版 LTSC 2021 正式版更新中。LTSC是長期服務渠道版本&#xff0c;網友俗稱“老壇酸菜版”&#xff0c;相當于精簡版Win10&#xff0c;精簡了很多預裝應用&#xff0c;同時更新頻率也更低&#xff0c…

Web3:Foundry使用指南

Foundry目錄1. 前言2. 什么是Foundry3. 安裝與環境配置1. 安裝工具2. 重新加載 .bashrc3. 檢查環境變量 PATH4. 手動運行 foundryup4. Foundry的基本使用1.創建一個新的Foundry項目2. 編寫智能合約3. 編譯智能合約4. foundry.toml 主要作用5.部署智能合約5. Cli參考1. forge2. …

uniapp+unipush推送配置

APP推送記錄 一、使用框架 Uniappunipush推送插件 二、需要提前準備的 1.準備自有證書 可以用這個網站—香蕉云編&#xff08;用于安卓 ios證書生成&#xff09;https://www.yunedit.com/update/androidzhengshu/list 安卓證書生成后&#xff0c;下載證書&#xff0c;除了原文…

CentOS系統哪些版本?分別適用于那些業務或網站類型?

CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一款開源的企業級 Linux 操作系統&#xff0c;因其穩定性、安全性和長期支持周期&#xff0c;廣泛應用于服務器環境。以下是 CentOS 的主要版本及其適用場景的詳細介紹。1. CentOS 主要版本CentOS 的版本…

【前端】【Iconify圖標庫】【vben3】createIconifyIcon 實現圖標組件的自動封裝

&#x1f9e9; Vue 圖標管理全攻略&#xff1a;Iconify createIconifyIcon 封裝最佳實踐 在前端項目中&#xff0c;圖標無處不在。按鈕需要圖標&#xff0c;導航需要圖標&#xff0c;提示信息也少不了圖標。如何優雅、高效地使用圖標&#xff0c;是每個中大型 Vue 項目不可回…

數據可視化全流程設計指南

一、需求定義階段1. 明確核心目標回答關鍵問題&#xff1a;2. 確定數據特性import pandas as pd data pd.read_csv(your_data.csv) print(f""" 數據概覽: - 維度: {data.shape[1]}列 {data.shape[0]}行 - 類型分布: {data.dtypes.value_counts()} - 缺失值: …

Llama系列:Llama1, Llama2,Llama3內容概述

前言 參考視頻&#xff1a;大模型修煉之道(三): Llama系列講解 Llama1&#xff0c;Llama2, Llama3_嗶哩嗶哩_bilibili 本博客是基于視頻的學習筆記&#xff0c;以及相關知識點的擴充 Llama1 1. 動機 使用完全開源數據&#xff0c;性能媲美GPT3研究開源&#xff0c;禁止商用…

Docker 搭建本地Harbor私有鏡像倉庫

Docker 搭建本地Harbor私有鏡像倉庫 一、Harbor 核心價值與企業級特性解析 在容器化技術普及的背景下&#xff0c;鏡像倉庫作為容器生命周期的核心組件&#xff0c;其可靠性直接影響開發效率與生產穩定性。Docker 官方的 Registry 雖能實現基礎鏡像存儲&#xff0c;但存在明顯短…

AI 助力:如何批量提取 Word 表格字段并導出至 Excel

在日常辦公中&#xff0c;我們經常需要處理大量的 Word 文檔中的表格數據&#xff0c;如學生登記表、客戶信息表、報名表等。然而這些表格往往格式各異、字段命名不統一&#xff08;如“姓名”“名字”“Name”&#xff09;&#xff0c;甚至含有合并單元格或多余空白行&#xf…

在 Azure Linux 上安裝 RustFS

本文分享在 Azure Linux 上安裝并使用對象存儲 RustFS 的過程。 關于 RustFS RustFS 是一款用 Rust 語言編寫的分布式存儲系統&#xff0c;兼容 S3 協議&#xff0c;是 MinIO 的國產化平替。詳情可以前往 RustFS 官網。目前&#xff0c;RustFS 支持二進制、Docker 安裝方式&am…

實現在線預覽pdf功能,后臺下載PDF

<!-- PDF預覽模態框 --><n-modalv-model:show"pdfModalVisible"title"投訴統計報告預覽":closable"false":mask-closable"false"positive-click"closePdfModal"positive-text"關閉":width"900"…

華為VS格行VS中興VS波導隨身WIFI6怎么選?流量卡OR隨身WIFI,長期使用到底誰更香?

在移動互聯時代&#xff0c;流量焦慮成為現代人的通病。面對"辦流量卡還是隨身WiFi"的抉擇&#xff0c;許多人陷入兩難。本文從實際需求出發&#xff0c;用數據和場景幫你精準決策&#xff0c;尤其這五類人群建議直接選擇正規隨身WiFi。一、這五類人&#xff0c;隨身…

AI網絡搜索

作為AI應用程序開發人員在了解函數調用&#xff08;Function Calling&#xff09;特性調用本地函數時可能注意到列表型參數tools中每一個元素都攜帶有一個type值。而在大多數函數調用示例程序中&#xff0c;這個type值一直被設定為“function”&#xff0c;這意味著它還可能存在…

39.Sentinel微服務流量控制組件

雪崩問題 微服務調用鏈路中某個服務故障,引起整個鏈路中的所有微服務都不可用。 解決方案 1.超時處理:設置一個超時時間,請求超過一定時間沒有響應就返回錯誤信息,不會無休止的等待。(只能起到緩解作用,并不能從根本上解決問題) 2.艙壁模式:限定每個業務能使用的線程…