Git 版本回退與撤銷修改

作為版本控制管理器,Git應當具備版本回退等一系列功能——它的應用場景也很常見,當你在工作區開發時,忽然發現:怎么我這版本寫的代碼還不如上一版本好?這時,版本回退功能就派上用場了。

一.版本回退

1.概覽

首先我們先明確版本回退的指令

git reset [--soft]|--mixed|[--hard]? [HEAD]

我們來一一解釋這幾個選項對應的作用。

ReadMe工作區暫存區版本庫選項
git worldgit worldgit worldgit--soft
git worldgitgit--mixed
gitgitgit--hard

1.--soft:僅回退版本庫的內容

2.--mixed:回退暫存區和版本庫內容,是默認選項

3.--hard:將所有區域內容全部回退,有可能會覆蓋當前工作區的內容,建議謹慎使用。

2.回退工作流

1.git log——查看日志。若要執行回退,首先要明確回退到哪個版本。

wujiahao@VM-12-14-ubuntu:~/gitcode$ git log --pretty=oneline
18812885f304b7ba2baa67a109a2762ebb6f85c3 (HEAD -> master) add some files
f5aa7498c931ae9bc6cf0edfa400f7ceb28816a9 add first word

2.git reset ——執行回退,選項后面跟上commitID即可。例如這里回退到 add some files。

wujiahao@VM-12-14-ubuntu:~/gitcode$ git reset --hard 18812885f304b7ba2baa67a109a2762ebb6f85c3
HEAD is now at 1881288 add some files#現在的效果
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git

3.git reflog——如果后悔回退怎么辦?可以查找本地所有reset操作的日志,回退到其他想要的版本(繼續執行git reset即可)

wujiahao@VM-12-14-ubuntu:~/gitcode$ git reflog
1881288 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
d6a7559 HEAD@{1}: commit: Modify ReadMe Third
1881288 (HEAD -> master) HEAD@{2}: reset: moving to 18812885f304b7ba2baa67a109a2762ebb6f85c3
1881288 (HEAD -> master) HEAD@{3}: commit: add some files
f5aa749 HEAD@{4}: commit (initial): add first word

3.回退的原理

我們在執行版本回退時,會發現其執行速度非常快。那么它的原理是什么呢?

根據commitID直接修改HEAD指針指向的git對象

二.撤銷修改

1.概覽

撤銷修改的情況可以大概分為以下幾類:

情況執行操作
僅修改工作區git checkout -- filename
執行了add,但沒有commit到版本庫

1.git reset --hard filename

2.git reset --mixed filename

git checkout -- filename

已經commit到版本庫,但沒有執行push到遠程倉庫git reset --hard

接下來一一進行詳解。

2.詳解

1.僅修改工作區

例如這里我們對ReadMe寫入xxx code

wujiahao@VM-12-14-ubuntu:~/gitcode$ vim ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git
xxx code

怎樣回退到之前的版本?我們當然可以選擇用vim編輯器等修改,但是修改的部分越多越復雜,這種方法越不實用。因此我們使用以下方法:

git checkout -- filename

wujiahao@VM-12-14-ubuntu:~/gitcode$ git checkout -- ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git

2.執行了add,但沒有commit到版本庫

我們寫入this is the second change并執行add

wujiahao@VM-12-14-ubuntu:~/gitcode$ vim ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git
this is the second change
wujiahao@VM-12-14-ubuntu:~/gitcode$ git add ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)modified:   ReadMeUntracked files:(use "git add <file>..." to include in what will be committed)file5

git status

查看當前git狀態,發現暫存區有文件被修改(ReadMe)

首先這里有兩種解決辦法,一種直接reset –hard,另一種是reset –mixed(默認選項),默認回退版本庫和暫存區,相當于回到了第一種情況。在這里介紹第二種用法

wujiahao@VM-12-14-ubuntu:~/gitcode$ git reset HEAD ReadMe
Unstaged changes after reset:
M	ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ git status
On branch master
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified:   ReadMeUntracked files:(use "git add <file>..." to include in what will be committed)file5no changes added to commit (use "git add" and/or "git commit -a")

然后再使用和情況1的指令即可

wujiahao@VM-12-14-ubuntu:~/gitcode$ git checkout -- ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ git status
On branch master
Untracked files:(use "git add <file>..." to include in what will be committed)file5nothing added to commit but untracked files present (use "git add" to track)
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git

3.已經commit到版本庫,但沒有執行push到遠程倉庫

我們加入 this is the third change,并且add和commit

wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git
wujiahao@VM-12-14-ubuntu:~/gitcode$ vim ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git
this is the third change
wujiahao@VM-12-14-ubuntu:~/gitcode$ git add ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ git commit -m "Modify ReadMe Third "
[master d6a7559] Modify ReadMe Third1 file changed, 1 insertion(+)

只需要用reset的hard選項即可,HEAD表示當前版本,那么上個版本就是HEAD^

wujiahao@VM-12-14-ubuntu:~/gitcode$ git reset --hard HEAD^
HEAD is now at 1881288 add some files
wujiahao@VM-12-14-ubuntu:~/gitcode$ git status
On branch master
Untracked files:(use "git add <file>..." to include in what will be committed)file5nothing added to commit but untracked files present (use "git add" to track)
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git

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

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

相關文章

學習日記-JS+DOM-day54-9.12

1.javascript基本說明知識點核心內容重點JavaScript基礎控制HTML內容與屬性&#xff0c;實現動態行為&#xff08;如開燈/關燈效果&#xff09;src屬性路徑修正&#xff08;./與../的區別&#xff09;前端三要素HTML&#xff08;內容&#xff09;、CSS&#xff08;樣式&#xf…

使用tree命令導出文件夾/文件的目錄樹( Windows 和 macOS)

你可以在終端&#xff08;命令提示符&#xff09;中使用 tree 命令來清晰直觀地查看和導出文件夾的目錄結構。下面我會詳細告訴你如何在 Windows 和 macOS 上使用它。 &#x1f5a5;? tree 命令基本用法 tree 命令的核心作用是以樹狀圖的形式展示指定路徑下的目錄和文件結構。…

GrapeCity Documents V8.0 Update2 重磅發布:性能飛躍、AI 賦能與文檔處理全流程升級

作為葡萄城旗下服務端文檔組件庫&#xff0c;GrapeCity Documents&#xff08;簡稱"GcDocs"&#xff09;憑借跨平臺、高兼容的優勢&#xff0c;已成為 眾多開發者構建文檔生成、編輯、轉換與管理系統的首選。 近日&#xff0c;GcDocs 迎來 V8.0 Update2 版本更新&am…

水質在線監測系統御控物聯網解決方案

一、行業背景與需求痛點水質安全是飲用水供應、工業生產、生態保護的核心要素。隨著《水污染防治行動計劃》的深入實施&#xff0c;傳統水質監測方式面臨三大挑戰&#xff1a;時效性不足&#xff1a;人工采樣-實驗室分析周期長達24-72小時&#xff0c;難以實時捕捉污染事件&…

【完整源碼+數據集+部署教程】倉庫物品分類檢測圖像分割系統源碼和數據集:改進yolo11-convnextv2

背景意義 研究背景與意義 隨著現代物流和倉儲管理的快速發展&#xff0c;物品分類與檢測技術在提高倉庫運營效率、降低人工成本方面發揮著越來越重要的作用。傳統的物品管理方式往往依賴人工識別和分類&#xff0c;效率低下且容易出錯。為了解決這一問題&#xff0c;基于計算機…

瀏覽器穩定性提升之路:線上崩潰率優化中的 Return 與 CHECK 之爭

一、前言在大型 C 工程&#xff08;例如 Chrome 瀏覽器內核&#xff09;中&#xff0c;開發者經常會遇到這樣的選擇&#xff1a; 到底應該在關鍵點使用 CHECK 直接崩潰&#xff0c;還是使用 return、LOG 記錄錯誤然后繼續執行&#xff1f;這看似只是一個代碼風格問題&#xff0…

【數據結構與算法Trip第3站】雙指針

我們來詳細講解一下算法中非常常用且重要的技巧——雙指針法。 這是一個概念清晰但應用極其廣泛的技術&#xff0c;掌握它能幫助你高效解決許多問題。 一、什么是雙指針法&#xff1f; 核心思想&#xff1a;顧名思義&#xff0c;就是在遍歷對象&#xff08;通常是數組或鏈表&am…

時序數據庫選型指南:基于大數據視角的IoTDB應用優勢分析詳解!

目錄 一、時序數據庫選型的基本原則 1.1 數據特征與需求分析 1.1.1 數據規模與寫入負載 1.1.2 查詢需求 1.1.3 數據保留與歸檔策略 1.1.4 系統擴展性與高可用性 1.2 技術架構與系統性能評估 1.2.1 寫入性能 1.2.2 查詢性能 1.2.3 數據壓縮能力 1.2.4 高可用性與災備…

緩存三大劫攻防戰:穿透、擊穿、雪崩的Java實戰防御體系(三)

第三部分&#xff1a;緩存雪崩——大量key失效引發的“系統性崩潰” 緩存雪崩的本質是“大量緩存key在同一時間失效&#xff0c;或緩存集群整體故障”&#xff0c;導致請求全量穿透至DB&#xff0c;引發“系統性崩潰”。 案例4&#xff1a;電商首頁的“批量過期”災難 故障現場…

解決docker配置了鏡像源但還會拉取官方鏡像源的問題

&#x1f3d3;我們有時候雖然配置了Docker國內鏡像源&#xff0c;但是還是會繞過去請求官方鏡像源&#xff08;docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded&#xff09;&#xff0c;現在我們就來解決一…

R語言水文、水環境模型優化:從最速上升法、嶺分析到貝葉斯優化與異方差處理,涵蓋采樣設計、代理模型與快速率定等

在水利工程、環境治理、生態保護、機械設計與航天航空等現代工業與科學領域&#xff0c;數學模型已成為不可或缺的核心分析、預測與決策工具。然而&#xff0c;隨著系統復雜性的日益增長&#xff0c;模型構建的精確性、參數率定的效率以及不確定性量化的重要性被提到了前所未有…

關于數據采集與處理心得(一)

目前所實踐的經驗告知我&#xff01;1. 別企圖妄想一個腳本解決所有問題要學會對問題分解&#xff0c;編寫多個腳本一步步將問題解決&#xff0c;如果每一個步驟都為了下一個階段的成果打地基&#xff0c;也是非常OK的。同時要盡可能將每一個編寫的腳本都盡到最大的利用率2. 編…

IvorySQL 適配 LoongArch? 龍架構

IvorySQL 社區很高興向您宣布&#xff0c;IvorySQL 已成功適配LoongArch 龍架構&#xff0c;為國產數據庫與國產芯片的深度融合邁出了堅實一步。這一里程碑標志著 IvorySQL 在推動國產化生態建設、賦能信創產業方面取得了重大突破&#xff0c;為用戶提供更高效、穩定、安全的數…

數據庫分庫分表是考慮ShardingSphere 還是Mycat?

http://www.mycat.org.cn/ https://shardingsphere.apache.org/ 這是一個非常核心且優秀的問題。在選擇 ShardingSphere 和 Mycat 之間&#xff0c;對于游戲這種高性能、高復雜度的場景&#xff0c;目前行業內的主流選擇和發展趨勢毫無疑問是 ShardingSphere。 我會為你詳細對…

mysql分庫分表數據量核查問題

場景&#xff1a; 使用分庫分表的業務有時分庫數量幾百甚至上千&#xff0c;當主管需要查詢每個庫中的數據&#xff0c;掌握數據分布情況。要你查看哪些庫中的表數量大于某個量級的給找出來 &#xff0c;你會怎么做。 例子 &#xff1a; mysql庫數量&#xff1a;db_xx_devicein…

python之socket網絡編程

引言 在互聯網時代&#xff0c;網絡編程已經成為開發人員必備的技能之一。無論是Web開發、實時通信還是分布式計算&#xff0c;都離不開網絡編程的支持。Python提供的socket模塊為我們提供了簡潔而強大的接口&#xff0c;可以輕松實現客戶端和服務器之間的通信。 Socket編程是網…

WPF Telerik.Windows.Controls.Data.PropertyGrid 自定義屬性編輯器

1.AI幫忙定義新用戶控件 2.在屬性上添加TelerikEditorAttribute特性 private ObservableCollection<string> _axisOrder;[Display(Description "點位", GroupName "通用", Name "軸&順序", Order 1)][DataMember][TelerikEditorAt…

【超詳細】別再看零散的教程了!一篇搞定Gitee從注冊、配置到代碼上傳與管理(內含避坑指南最佳實踐)

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題、洛谷刷題、C/C基礎知識知識強化補充、C/C干貨分享&學習過程記錄 &#x1f349;學習方向&#xff1a;C/C方向學習者…

43.shell腳本循環與函數

shell腳本循環與函數 for 循環 for 循環用于一次性讀取多個信息&#xff0c;逐一對信息進行操作處理&#xff0c;特別適合處理有范圍的數據 語法 for 變量名 in 取值列表 do命令序列 done批量創建用戶 #!/bin/bashtouch /root/users.txt echo aka blues cloe dio foks > /ro…

模型部署:(四)安卓端部署Yolov8-v8.2.99實例分割項目全流程記錄

模型部署&#xff1a;&#xff08;四&#xff09;安卓端部署Yolov8-v8.2.99實例分割項目全流程記錄1、下載ncnn2、下載opencv-mobile3、文件拷貝4、andorid_studio相關配置5、文件內參數設置5、重構項目&#xff1a;6、打包apk7、部署自己訓練的實例分割模型1、下載ncnn 地址&…