Git 回退操作詳解:帶示例的“小白”指南

前言

在日常開發中,我們難免會遇到:

  • 改錯代碼:推送之前才發現某些行根本就不該動
  • 提交錯誤:commit 信息打錯、提交到錯誤分支
  • 想回到之前版本:測試時發現之前版本是好的,需要回去查看

這就需要用到 Git 的回退操作。Git 提供多種回退方式,比如:checkoutresetrevertreflog 等。下面會從最常見的場景入手,一步步解釋 怎么做 + 為什么這樣做


1. 概念簡單區分

為了后面理解更順暢,先做最簡要的概念區分:

  • 工作區(Working Directory):就是你平時編輯文件所在的那一層文件夾。
  • 暫存區(Staging Area):你用 git add 之后,文件的修改就放到這里,等待下一次提交。
  • 本地倉庫(Local Repository):你執行 git commit 后,才真正存到本地倉庫里。
  • 遠程倉庫(Remote Repository)git push 后,修改才會傳到遠程,比如 GitHub、GitLab 等。

不同的回退命令,操作作用在不同的階段。


2. 撤銷尚未提交的修改(還在工作區)

場景示例

你剛寫完一段代碼,突然發現完全寫錯了,還沒來得及用 git add。你想丟棄掉這一切。

命令

# 撤銷當前工作區所有未提交的更改
git checkout -- .

或者,如果只想丟棄某個文件的更改:

git checkout -- <filename>

詳解

  • checkout -- <文件> 會用最近一次提交中的版本覆蓋你的工作區文件,達成“把文件回滾到上次提交狀態”的效果。
  • 這時候,如果你還沒有 git add,那么這個命令就是最簡單的丟棄本地改動方式。

3. 撤銷已 git add 但未 commit 的修改

場景示例

你已經執行了 git add somefile.py,但沒執行 git commit。突然發現有些改動是不想提交的。

命令

  1. 先把文件從暫存區移回工作區:
    git reset HEAD <filename>
    
  2. 再丟棄該文件在工作區的改動(如果還要丟棄的話):
    git checkout -- <filename>
    

詳解

  • git reset HEAD <filename>:把 <filename>暫存區撤回到工作區
  • git checkout -- <filename>:丟棄工作區中的改動,回到上一次提交的狀態。

如果你只是想取消暫存,但是保留文件的編輯(也許還想再改),那就只執行第一步即可。


4. 撤銷最近一次提交:git reset 的用法

當你已經提交了 (commit),但你后悔了,比如提交漏寫了某些文件、或者發現了語法錯誤,想重新來。

4.1 保留改動到工作區:--soft

“我想把最新一次提交退回,但代碼還留著(我想再改改,之后重新提交)。”

git reset --soft HEAD~1
  • HEAD~1 表示上一個提交(也可以用 commit ID 的前幾位代替)。
  • --soft 會把那次提交的所有改動放回到“暫存區”,讓你可以繼續進行修改或重新提交。

4.2 完全丟棄改動:--hard

“我想徹底刪除最近一次提交里的所有更改,干干凈凈回到上一個版本。”

git reset --hard HEAD~1
  • 這會永久刪除那次提交及其工作區更改,除非你通過 reflog 找回。
  • 請謹慎操作:如果你需要的內容都沒了,可能得不到恢復。

示例場景

  1. 你寫了一個新功能,git commit -m \"add new feature\"
  2. 結果發現寫錯功能邏輯,決定先回到不帶該功能的舊版本去調試。
    • 如果你還想保留這段代碼,可以改良后再提交:
      git reset --soft HEAD~1
      # 現在那次提交的改動還在暫存區,你可以用編輯器繼續修改
      git commit -m \"fix new feature\"
      
    • 如果你完全不想要那次提交,干脆刪掉:
      git reset --hard HEAD~1
      # 徹底回到之前的版本
      

5. 撤銷某一次特定提交:git revert

場景示例

你在歷史上第 10 個提交里改了數據庫配置,影響到現在的運行。想把那次提交撤銷,但又不想影響中間其他 commits。

命令

git revert <具體的commit_id>

執行后,會自動開啟一個編輯器讓你寫“撤銷 xx 提交”的說明,然后自動生成一個新的提交,用以反向撤銷指定版本的改動。

詳解

  • git revert 不會改變原來的提交歷史,而是生成一個“負向補丁”把之前提交的內容給抵消掉。
  • 這種做法最安全:不會打亂別人的歷史,也不需要強制推送。團隊協作中非常常用。

6. 想把本地回退同步到遠程:強制推送 git push -f

場景示例

你在本地用 git reset --hard 回退到了一個老版本,然后希望遠程倉庫也回退。此時,如果直接 git push,Git 會拒絕,因為本地分支歷史“比遠程版本更舊”。

命令

git push origin <branch_name> --force
  • 這會把遠程倉庫對應分支的提交歷史整體替換成你本地的版本。

風險提示

  • 一旦你強制推送,之前在遠程的提交記錄將被覆蓋。
  • 如果有其他人基于那幾個被覆蓋的提交做了工作,會引起沖突或混亂。
  • 因此,強制推送前,一定先跟團隊溝通

7. 誤操作后的救命繩:git reflog

場景示例

你一激動用 git reset --hard HEAD~2 結果發現需要的東西被刪了。或者你已經 push -f 把遠程也覆蓋了……

命令

git reflog

會列出所有操作記錄,包括 checkoutcommitresetmergerebase 等。你會看到一串記錄,如:

a1b2c3d HEAD@{0}: reset: moving to HEAD~2
f6g7h8i HEAD@{1}: commit: add new feature
...
  • 你可以找到需要的提交 ID,然后用:
    git reset --hard <提交ID>
    
    或者
    git checkout <提交ID>
    
    把那個版本再取出來。

詳解

  • reflog 相當于 Git 的本地“操作歷史日志”。只要本地沒有執行更深度的清理(比如 git gc --prune=now),通常都能在 reflog 找到過往的 commit。
  • 這是你“最后的后悔藥”,別輕易亂刪本地倉庫!

8. 你可能關心的常見問題

  1. 已經 push 到遠程的提交,能不能用 reset 撤銷?
    • 可以,但要用 push -f 強制推送,會影響其他人。所以一般用 git revert 而不是 reset
  2. git revertgit reset 有啥區別?
    • reset 是改變歷史本身,“抹掉”提交;revert 是做一個新的提交來“抵消”之前提交的變化。revert 更安全,協作中更推薦。
  3. 能不能同時撤銷多個提交?
    • 可以:git revert a1b2c3d..f6g7h8i (如果中間需要處理沖突,也要人工處理)。不過要對 git revert 比較熟悉才行。
  4. 回退后發現我又需要那段代碼,怎么辦?
    • 看看 reflog 能不能救。因為 reset --hard 并不是真正銷毀,除非被垃圾回收 (git gc) 清理。

總結:回退操作一覽表

需求場景操作風險性
工作區未暫存的改動想丟棄git checkout -- <file>
已暫存(但未提交)的改動想丟棄git reset HEAD <file> + git checkout -- <file>
撤銷本地最后一次提交,保留改動到工作區git reset --soft HEAD~1相對可控
徹底刪除最后一次提交,不保留改動git reset --hard HEAD~1高,無法輕易恢復
撤銷歷史中某個特定提交(留下回滾記錄)git revert <commit_id>
強制把回退操作更新到遠程git push -f origin <branch>高,需溝通
查看所有本地操作日志,從中找到想恢復的 commitgit reflog無風險(只讀)

結束語

以上就是 Git 回退最常用的幾種操作,結合了具體的使用場景和示例流程。作為新手,最重要的是:

  1. 明白回退命令改動的是哪些區(工作區、暫存區、本地倉庫、遠程倉庫)
  2. 回退前先想清楚:自己是否真的要破壞歷史?能不能用 git revert?
  3. 一旦強制推送,一定要先溝通
  4. 誤操作之后,別忘了 git reflog

希望這篇指南能幫助你在回退操作時更加從容,避免一些“萬劫不復”的失誤。祝你在開發中“一騎絕塵”、少踩坑、多出成果!

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

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

相關文章

redux以及react-redux

1.redux案例完整版 上一篇文章我們是沒有action文件&#xff0c;直接在countre組件與store以及reducer直接進行狀態的改變以及展示。 下面我們加上action文件&#xff0c;我們就不能直接通過dispatch傳&#xff0c;而是通過調用action里面的函數講我們傳入的參數變成action這種…

idea中配置svn及提交提示“未檢測到更改”提示

首先要安裝TortoiseSVN&#xff0c;選command line client tools&#xff1b; 在idea中&#xff0c;文件->設置->Subversion->如下圖 文件->設置->目錄映射->如下圖 初次導入到svn&#xff0c; 輸入服務器上的svn地址&#xff0c;等待成功即可&#xff1b;…

vue 實現dot-dropdown

<template><div class"app-container"><div class"mt30"></div><el-row :gutter"20"><!-- title --><!-- <div class"modt-box">導航管理</div> --><el-col :span"2&q…

使用 mysql2/promise 模塊返回以后,使用 await 返回數據總結

SELECT 返回結構 const [rows, fields] await db.query(SELECT * FROM folders);返回&#xff1a; rows: 是一個數組&#xff0c;包含所有查到的記錄。fields: 是字段的結構定義&#xff08;列信息&#xff09;&#xff0c;一般不用。 rows 是一個數組&#xff0c;包含所有…

Manus Metagloves pro高精度+無漂移+低延遲 ,重構VR/XR手部交互方式

manus metagloves pro是一款專為動畫制作、虛擬現實及游戲開發打造的高精度無線動作捕捉手套。采用先進的Quantum追蹤技術&#xff0c;實現毫米級動作捕捉&#xff0c;精準還原手指細節&#xff0c;顯著提升創作效率與交互真實感。 MANUS Metagloves Pro解鎖動捕 / 機器人 / XR…

Uniapp插件改造指南:如何讓vue-plugin支持HarmonyOS5原生能力?

一、分層架構設計 采用通用邏輯與平臺實現分離的三層結構&#xff1a; uni-plugin-harmony ├── common # 跨平臺通用層 │ ├── interfaces # 能力接口抽象&#xff08;如Scanner.ets&#xff09; │ └── utils # 工具類 ├── harmony …

P1040 [NOIP 2003 提高組] 加分二叉樹 題解

題目描述 設一個 n n n 個節點的二叉樹 tree \text{tree} tree 的中序遍歷為 ( 1 , 2 , 3 , … , n ) (1,2,3,\ldots,n) (1,2,3,…,n)&#xff0c;每個節點都有一個分數&#xff08;均為正整數&#xff09;。任一棵子樹 subtree \text{subtree} subtree&#xff08;包含 tr…

【Golang面試題】Data Race 問題怎么檢測?

Go Race Detector 深度指南&#xff1a;原理、用法與實戰技巧 一、什么是數據競爭&#xff1f; 在并發編程中&#xff0c;數據競爭發生在兩個或多個 goroutine 同時訪問同一內存位置&#xff0c;且至少有一個是寫操作時。這種競爭會導致不可預測的行為和極其難以調試的問題。…

257. 二叉樹的所有路徑(js)

257. 二叉樹的所有路徑——DFS 回溯&#xff08;js&#xff09; 題目描述解題思路完整代碼時間復雜度分析 題目描述 257. 二叉樹的所有路徑 解題思路 題意理解 給定一棵二叉樹&#xff0c;要求返回所有從根節點到葉子節點的路徑&#xff0c;路徑以字符串形式表示&#xff0c…

自動化文檔生成工具(親測可運行)

本文介紹了一個用Java編寫的自動化文檔生成工具&#xff0c;通過讀取開發清單文本自動生成格式規范的Word文檔。該工具的主要特點包括&#xff1a; 采用Apache POI庫處理Word文檔&#xff0c;支持多級標題和段落自動生成實現中文數字轉換功能&#xff0c;將編號轉換為"一、…

湖北理元理律師事務所債務優化模型:法律與生活的平衡之道

在債務重組領域&#xff0c;專業機構需同時解決兩個矛盾&#xff1a;法律合規性與債務人可持續生存能力。湖北理元理律師事務所通過“三維干預模型”&#xff0c;在武漢某餐飲連鎖企業債務危機中驗證了該方案的有效性。 一、法律底層設計&#xff1a;還款方案的合法性審查 以該…

Web3-代幣ERC20/ERC721以及合約安全溢出和下溢的研究

Web3-代幣ERC20/ERC721以及合約安全溢出和下溢的研究 以太坊上的代幣 如果你對以太坊的世界有一些了解&#xff0c;你很可能聽人們聊過代幣— ERC20代幣 一個 代幣 在以太坊基本上就是一個遵循一些共同規則的智能合約——即它實現了所有其他代幣合約共享的一組標準函數&…

論文筆記 <交通燈><多智能體>MetaLight:基于價值的元強化學習用于交通信號控制

今天看的論文是這篇MetaLight:基于價值的元強化學習用于交通信號控制 里面提到的創新點就是MetaLight框架&#xff1a;他目標是讓交通信號控制智能體&#xff08;Agent&#xff09;在新路口&#xff08;即使結構或流量模式不同&#xff09;上能??快速學習??&#xff08;Few…

華為OD-2024年E卷-尋找符合要求的最長子串[200分] -- python

問題描述&#xff1a; 給定一個字符串s&#xff0c;找出這樣一個子串: 1)該子串中的任意一個字符最多出現2次; 2)該子串不包含指定某個字符; 請你找出滿足該條件的最長子串的長度。 輸入描述 第一行為要求不包含的指定字符&#xff0c;為單個字符&#xff0c;取值范圍[0-9a-zA…

CppCon 2016 學習:What C++ Programmers Need to Know about Header <random>

隨機數生成的歷史背景 Middle-Square 方法&#xff08;中位平方法&#xff09;&#xff1a; 已知最早的隨機算法之一或由修道士 Brother Edvin 在 1245 年發明由 John von Neumann 在 1949 年重新發現缺點明顯&#xff0c;但執行速度快 Monte Carlo 方法&#xff1a; 起初是…

Origin:誤差棒點線圖繪制

1.首先將你的數據復制到表格 2.選中B(y)列數據&#xff0c;依次點擊圖示選項 3.選中圖中紅框數據&#xff0c;點擊繪制點線圖即可 4.結果展示

Spring 源碼學習 1:ApplicationContext

Spring 源碼學習 1&#xff1a;ApplicationContext Bean 定義和 Bean 實例 AnnotationConfigApplicationContext 首先&#xff0c;創建一個最簡單的 Spring Boot 應用。 在入口類中接收SpringApplication.run的返回值&#xff1a; SpringBootApplication public class Dem…

CppCon 2017 學習:Design Patterns for Low-Level Real-Time Rendering

這段內容講的是離散顯卡&#xff08;Discrete GPU&#xff09;中的內存管理模型&#xff0c;重點是CPU和GPU各自獨立管理自己的物理內存&#xff0c;以及它們如何通過虛擬內存和DMA引擎實現高效通信。以下是詳細的理解和梳理&#xff1a; 1. 基本概念 CPU 和 GPU 是兩個獨立的…

【單調隊列】-----【原理+模版】

單調隊列 一、什么是單調隊列&#xff1f; 單調隊列是一種在滑動窗口或區間查詢中維護候選元素單調性的數據結構&#xff0c;通常用于解決“滑動窗口最大值/最小值”等問題。 核心思想是&#xff1a;利用雙端隊列&#xff08;deque&#xff09;維護當前窗口內或候選范圍內元素…

CSS語法中的選擇器與屬性詳解

CSS:層疊樣式表&#xff0c;Cascading Style Sheets 層疊樣式表 內容和樣式分離解耦&#xff0c;便于修改樣式。 特殊說明&#xff1a; 最后一條聲明可以沒有分號&#xff0c;但是為了以后修改方便&#xff0c;一般也加上分號為了使用樣式更加容易閱讀&#xff0c;可以將每條代…