主頁 > 軟體工程 > 沒想到,Git居然有3種“后悔藥”!

沒想到,Git居然有3種“后悔藥”!

2020-09-10 05:30:42 軟體工程

沒想到,Git居然有后悔藥!

你知道Git版本控制系統中都有哪些“后悔藥”嗎?

本文通過案例講解git reset 、 git revert 、 git checkout在版本控制中的作用;

場景

小明同學作為新人加入到一個新的專案組中做開發,在專案的迭代開發中,小明勤勤懇懇的寫代碼,直到有一次...

小明:完了,完蛋了

洋仔:怎么了,一驚一乍的

小明:我把錯誤代碼用git commit后還push到線上代碼庫了! 這可怎么辦!

洋仔:莫慌,git有“后悔藥”!

洋仔:容我給你慢慢道來, 但是我們要先知道一些git的基礎知識,你才能更好的理解git命令的作用

預備知識

git將專案的存盤分為4部分,每部分有自己作用,

見下圖:

  • Workspace:作業區(當前用戶操作修改的區域)
  • Index / Stage:暫存區 (add后的區域)
  • Repository:倉庫區或本地倉庫(commit后的區域)
  • Remote:遠程倉庫(push后的區域)

整體程序可以簡述為:

  • 作業區–>add–>暫存區–>commit–>本地倉庫區–>push–>遠程倉庫區
  • 遠程倉庫區–>fetch–>使用refs\remotes下對應分支檔案記錄遠程分支末端commit_id 和 本地倉庫區 -->merge–>作業區
  • 遠程倉庫區–>pull–>使用refs\remotes下對應分支檔案記錄遠程分支末端commit_id and 本地倉庫區 and 作業區

具體的git的組成部分和概念命令,請移步下述兩個博客:

Git技術干貨!作業中Git的使用實踐和常用命令合集!

Git - 使用git不知道內部實作機制怎么行

假設專案存在這么一個提交記錄:

$ git log
commit commit_id4 (HEAD -> master)
Author: test
Date:   Thu Aug 20 16:28:45 2020 +0800
    第三次修改README檔案

commit commit_id3 (HEAD -> master)
Author: test
Date:   Thu Aug 20 16:28:45 2020 +0800
    第二次修改README檔案

commit commit_id2
Author: test
Date:   Thu Aug 20 16:28:19 2020 +0800
    第一次修改README檔案

commit commit_id1
Author: test
Date:   Thu Aug 20 16:26:59 2020 +080
    初始化專案

提交順序為:commit_id1 --> commit_id2 --> commit_id3 --> commit_id4

注意:在git中每次的commit都有一個commit id唯一標識當前的提交!

下面,我們先來解決小明的這個問題,使用git reset即可完美解決~

問題解決

洋仔:小明,你的這個就可以用git reset 這個命令來完美的搞定,下面我們看一下如何解決

1、獲取當前提交的commit id

命令:git log

獲取到當前專案分支下的所有commit記錄;

假設上述小明提交錯誤的commit id為commit id:commit_id4這一次提交;

他的上一次提交就是commit id:commit_id3 ,我們要將修改回滾到commit_id3的時刻!

小明:我想要把我剛才 commit的修改保留下來,我修改的代碼不能給我洗掉掉呀!

洋仔:沒問題

2、將某個commit id前的commit清除,并保留修改的代碼

命令:git reset <commit_id> 當前場景下就是:git reset commit_id3

將指定commit_id后的所有提交,都去除,并保留修改的代碼在本地的區域,也就是Workspace

小明:啊哈,這樣的話我就可以把錯誤代碼修改后再提交了; 但是我已經push到線上倉庫的資料怎么辦呢?

洋仔:別急,有辦法~

3、修改代碼完成后,將修改好的代碼add到暫存區,并提交到本地倉庫中

命令:git add <file_name> and git commit 當前場景下:git add . and git commit

將最新修改后的代碼commit

則提交后的提交記錄假設如下: 可以看到,我們錯誤提交的commit_id4提交記錄消失,取而代之的是我們更新代碼后提交的記錄commit_id5; 這樣就完成了本地的代碼修改和更新

$ git log
commit commit_id5 (HEAD -> master)
Author: test
Date:   Thu Aug 20 16:28:45 2020 +0800
    第三次修改README檔案-更新錯誤后提交

commit commit_id3 (HEAD -> master)
Author: test
Date:   Thu Aug 20 16:28:45 2020 +0800
    第二次修改README檔案

commit commit_id2
Author: test
Date:   Thu Aug 20 16:28:19 2020 +0800
    第一次修改README檔案

commit commit_id1
Author: test
Date:   Thu Aug 20 16:26:59 2020 +080
    初始化專案

4、將本地修改同步到遠程倉庫

命令:git push origin HEAD --force

將本地修改強行同步到遠程倉庫,使得遠程倉庫和本地倉庫保持一致!

整體流程如下:

git log
git reset commit_id3
修改代碼
git add .
git commit -m '第三次修改README檔案-更新錯誤后提交'
git push origin HEAD --force

洋仔:好了,小明,你的問題完美解決了

小明:哦吼,但是我還有一個問題: 如果我想要不保留回滾commit的修改,直接洗掉掉修改!該怎么處理呢?

洋仔:簡單~ 我們整體看一下 git reset 命令

后悔藥-git reset

在進行下面的講解是,還是先假設有這么一個提交鏈:

commit_id1 --> commit_id2 --> commit_id3 --> commit_id4

git reset commit_id2:

reset是將HEAD重新定位到commit_id2上,對于commit_id3 和 commit_id4 和本地當前的修改,對于不同的引數param,會有不同的處理;

reset命令有三種處理模式:

  • --soft:保留commit修改,將修改存盤到index中;也就是說git add后的區域
  • --mixed:保留commit修改,將修改存盤到本地作業區域中;也就是說git add前的區域
  • --hard:洗掉commit修改,慎用!

git reset --soft

回滾commit_id前的所有提交,不洗掉修改:

git reset --soft commit_id

重設head,不動index,所以效果是commit_id之后的commit修改全部在index中
將id3 和 id4的修改放到index區(暫存區),也就是add后檔案存放的區域,本地當前的修改保留

git reset --mixed

回滾commit_id前的所有提交,不洗掉修改:
git reset commit_id 等同于 git reset --mixed commit_id

與 下述的 git reset --hard commit_id效果不同

重設head 和 index,不重設work tree,效果就是commit_id之前的修改,全部在work tree中,為還未add的狀態
將id3 和 id4 的所有修改放到本地作業區中,本地當前的修改保留

git reset --hard

回滾commit_id前的所有提交,將修改全部洗掉:
git reset --hard commit_id

重設head、index、work tree,也就是說將當前專案的狀態恢復到commit_id的狀態,其余的全部洗掉(包含commit_id后的提交和本地還未提交的修改)
慎用!!

后悔藥-git revert

小明:原來git reset這么強大呀! 但是我這還有個問題:

如果想要只操作修改中間的一個commit,不對其他的commit產生影響; 也就是類似于我們只修改commit_id2,而對commit_id3 和 commit_id4無影響,該怎么處理呢?

洋仔:(這么多問題,幸虧我懂,要不這次就丟大了,,) 簡單! git revert 命令!

裝b

適用場景: 在專案開發中,突然發現在前幾次的提交中,有一次提交中包含一個bug; 當然我們可以進行一個新的修改,然后再提交一次; 但是,不優雅哈哈; 我們可以直接重做有bug的commit~

為什么不直接去再添加一個commit呢? git revert是用于“反做”某一個版本,以達到撤銷該版本的修改的目的,

比如,我們commit了三個版本(版本一、版本二、 版本三),突然發現版本二不行(如:有bug),想要撤銷版本二,但又不想影響撤銷版本三的提交,就可以用 git revert 命令來反做版本二,生成新的版本四,這個版本四里會保留版本三的東西,但撤銷了版本二的東西;

在revert命令中常用的就兩個:

  • git revert -e <commit_id>:重做指定commit的提交資訊
  • git revert -n <commit_id>:重做執行commit的代碼修改

git revert -e

重做commit_id的提交資訊,生成為一個新的new_commit_id
git revert -e commit_id

git revert -n

重做commit_id的提交
git revert -n commit_id
將commit_id中修改,放到index區,我們可以對他重新做修改并重新提交

revert vs reset

  • git revert是用一次新的commit來回滾之前的commit,此次提交之前的commit都會被保留不動;
  • git reset是回到某次提交,提交及之前的commit都會被保留,但是此commit id之后的修改都會被洗掉或放回作業區等待下一次提交;

小明:還有這種操作,可以直接單獨操作提交程序中的某一個commit! 太棒了!

后悔藥-git checkout

小明:還有最后一個問題:

如果我在一次開發中,發現某個檔案修改錯誤了,想要將檔案恢復到剛pull代碼時的狀態怎么辦呢?

洋仔:簡單! 看git checkout解決這個問題!

我們知道使用git checkout可以

  • git checkout <branch_name>切換分支

  • git checkout -b <branch_bame>創建分支等操作

它還有回滾指定檔案的修改的功能

命令:git checkout -- <file_name>

上述陳述句的作用,就是將file_name的本地作業區的修改全部撤銷,有兩種情況:

  • 如果file_name在commit后沒有add過這個檔案,則撤銷到版本庫中的狀態

  • 如果file_name在commit后add過這個檔案,則撤銷到暫存區的狀態,也就是add后的狀態

總之,就是讓指定的檔案回滾到最近的一次git add 或者 git commit時的狀態!

小明:太棒了,以后再也不怕提錯代碼了!

總結

上述,我們介紹了git reset \ git revert \ git checkout 在版本回滾、重做、撤銷修改方面的作用;

可以應用到作業中對 誤操作、不滿足要求、不滿足意愿的commit記錄的重做和修改;

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/997.html

標籤:其他

上一篇:專案微管理37 - 陣痛

下一篇:Git:RPC failed; HTTP 413 curl 22 The requested URL returned error: 413

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more