當前位置: 妍妍網 > 碼農

git送出錯了?別慌,直接刪除送出記錄

2024-05-05碼農

來源:juejin.cn/post/7355692365330792488

👉 歡迎 ,你將獲得: 專屬的計畫實戰 / Java 學習路線 / 一對一提問 / 學習打卡 / 贈書福利

全棧前後端分離部落格計畫 2.0 版本完結啦, 演示連結 http://116.62.199.48/ 新計畫正在醞釀中 。全程手摸手,後端 + 前端全棧開發,從 0 到 1 講解每個功能點開發步驟,1v1 答疑,直到計畫上線。 目前已更新了239小節,累計38w+字,講解圖:1645張,還在持續爆肝中.. 後續還會上新更多計畫,目標是將Java領域典型的計畫都整一波,如秒殺系統, 線上商城, IM即時通訊,Spring Cloud Alibaba 等等,


為什麽要刪除送出歷史

前幾天產品提了個很扯淡的需求,我在程式碼了進行了吐槽....

圖片

要命的是我不下心進行了程式碼送出:

圖片

我們的遠端倉庫大家都能看見的

圖片

這要是被其他人發現就慘了!當務之急,我必須立刻馬上 刪除 這一條送出記錄!!

於是,我開啟百度,搜尋到兩個救命關鍵詞: git revert git reset !這兩個命令都有撤銷操作的功能!

使用git revert撤銷送出

revert的英文釋義是回復、恢復(到原來的狀態)

作用

git revert 是 Git 中用於撤銷一個或多個送出的命令,但是會保留歷史記錄。它建立一個新的送出,該送出是對原送出的相反操作,以撤銷原送出的更改。透過 git revert 撤銷送出,可以保持歷史記錄的完整性,不會修改已經共享的送出歷史。

語法

撤銷單個送出:

git revert <commit-hash>

這會建立一個新的送出,用於撤銷指定的送出 的更改。

撤銷多個送出:

git revert <commit-hash1> <commit-hash2> ...

這會為每個指定的送出建立一個新的撤銷送出。

撤銷最近的送出:

git revert HEAD

撤銷某個範圍內的送出:

git revert <commit-hash1>^..<commit-hash2>

這會撤銷從 (不包括)到 (包括)範圍內的所有送出。

撤銷送出時,Git 會開啟一個文字編輯器,讓你輸入撤銷送出的資訊。你可以修改預設的送出資訊,然後保存並關閉編輯器。

撤銷實操

不管3721,我們先試著用它撤銷下送出試試。

先試用git log(其他視覺化面板也行)找到要撤銷的commit哈希碼

b1b56b50a0859556623283946972e495d4a42fc1

圖片

然後,執行單個檔撤銷命令

git revert b1b56b50a0859556623283946972e495d4a42fc1

執行命令後,控制台會出現vim編輯器,讓我們為本次更改送出說明

圖片

vim編輯器小技巧

  • 進入編輯模式:進入編輯模式的方式取決於當前編輯器的模式。通常情況下,按下 i 鍵可以進入插入模式,允許你編輯文本。

  • 編輯文本:在插入模式下,你可以編輯文本。使用方向鍵或者 h, j, k, l 鍵移動光標。

  • 結束編輯模式:編輯完成後,按下 Esc 鍵結束插入模式。

  • 保存並結束:在結束編輯模式後,輸入 :wq 並按下 Enter 鍵,可以保存並結束編輯器。

  • 放棄更改並結束:在結束編輯模式後,輸入 :q! 並按下 Enter 鍵,可以放棄更改並結束編輯器。

  • 我們點選i輸入送出說明【刪除錯誤送出】,然後點選ESC結束編輯模式,最後輸入:wq保存並結束。

    結束vim編輯器後,直接輸入 git push 推播程式碼!

    我們來看看效果:

    程式碼裏上次送出的內容確實沒了!

    第一次錯誤送出時的程式碼內容

    圖片

    revert後的程式碼內容

    圖片

    但是,git的推播歷史上有啊!!

    圖片

    這下我算明白了git revert的作用了:用於撤銷一個或多個送出的命令,但是會 保留歷史記錄

    這顯然不是我的意圖,我想做的是刪除git送出歷史!刪除!不保留任何痕跡呢種!只能試試git reset了!

    使用git reset撤銷送出

    憑借我初中畢業的水平,我一眼就明白了reset的含義:重設!現在,我們先看看 git reset 的作用。

    作用

    git reset 用於移動 HEAD 指標並可選地更改暫存區和工作目錄的狀態。它是一個非常強大的工具,常用於撤銷送出、取消暫存檔、修改送出內容等操作。

    語法

    撤銷送出,保留修改

    git reset --soft HEAD~1

    這會將 HEAD 指向的分支的最新送出撤銷掉,並保留所有更改在工作目錄中。這樣你就可以重新送出,並修改送出資訊。

    撤銷送出,取消暫存的檔

    git reset HEAD~1

    這會將 HEAD 指向的分支的最新送出撤銷掉,並將暫存區的檔取消暫存,但保留在工作目錄中。這樣你可以重新選擇要暫存的檔。

    撤銷送出,丟棄修改

    git reset --hard HEAD~1

    這會將 HEAD 指向的分支的最新送出撤銷掉,並丟棄所有更改,包括暫存區和工作目錄中的檔。這樣你就可以完全回到上一個送出的狀態。

    將 HEAD 指標移動到指定的送出

    git reset --hard <commit-hash>

    這會將 HEAD 指標移動到指定的送出,並丟棄所有更改。這可以用來回滾到歷史送出狀態

    撤銷實操

    由於本地沒有其他修改,暫存區也沒有檔,因此,使用

    git reset HEAD~1

    但是,我們剛才的誤操作,導致有兩條不應該出現的操作記錄

    圖片

    所以,我們HEAD指標應該向下移動2個

    git reset HEAD~2

    命令列輸入後,我們就會發現本地程式碼已經恢復到沒有送出這兩個記錄前的狀態了!

    但雲端的記錄還在

    圖片

    那如何刪除雲端的記錄呢?很簡單,將本地倉庫的程式碼強推到遠端倉庫覆蓋掉就行!(本地倉庫已經是未送出兩個錯誤資訊時的狀態了)

    最後,我們使用下面的命令將本地程式碼強行覆蓋雲端

    git push --force

    執行完後,就是見證奇跡的時刻

    圖片

    再看看git上

    圖片

    也沒有,nice!!

    重要提示

    使用 --force 選項將覆蓋遠端倉庫的送出歷史,這意味著遠端倉庫的歷史將會變為你本地倉庫的歷史。這是非常 危險 的操作!!一定要確保本地程式碼和遠端程式碼是相關的!! 一定要謹慎操作 !!

    註git push --force是下面命令的簡寫

    git push origin <branch-name> --force

    git push origin --force 命令用於將本地分支推播到遠端倉庫,並且使用 --force 選項強制覆蓋遠端倉庫中的送出歷史。

  • git push: 將本地分支的送出推播到遠端倉庫。

  • origin: 指定遠端倉庫的別名。通常指向你複制或者添加遠端倉庫時所使用的 URL。

  • : 要推播的本地分支的名稱。

  • --force (或 -f): 強制推播選項。這會覆蓋遠端倉庫的送出歷史,即使本地分支的送出歷史不是遠端分支的子集也會強制推播。

  • 總結

    git reset 用於移動分支的指標,可以修改送出歷史,但不會建立新的送出;而 git revert 用於撤銷先前的送出,並建立一個新的送出來保持送出歷史的完整性。

    透過本例項,你一定學會了使用 git reset git push --force 的方法刪除遠端倉庫的錯誤送出歷史!如果有收獲,記得收藏點贊哈~

    👉 歡迎 ,你將獲得: 專屬的計畫實戰 / Java 學習路線 / 一對一提問 / 學習打卡 / 贈書福利

    全棧前後端分離部落格計畫 2.0 版本完結啦, 演示連結 http://116.62.199.48/ 新計畫正在醞釀中 。全程手摸手,後端 + 前端全棧開發,從 0 到 1 講解每個功能點開發步驟,1v1 答疑,直到計畫上線。 目前已更新了239小節,累計38w+字,講解圖:1645張,還在持續爆肝中.. 後續還會上新更多計畫,目標是將Java領域典型的計畫都整一波,如秒殺系統, 線上商城, IM即時通訊,Spring Cloud Alibaba 等等,


    1. 

    2. 

    3. 

    4. 

    最近面試BAT,整理一份面試資料Java面試BATJ通關手冊,覆蓋了Java核心技術、JVM、Java並行、SSM、微服務、資料庫、數據結構等等。

    獲取方式:點「在看」,關註公眾號並回復 Java 領取,更多內容陸續奉上。

    PS:因公眾號平台更改了推播規則,如果不想錯過內容,記得讀完點一下在看,加個星標,這樣每次新文章推播才會第一時間出現在你的訂閱列表裏。

    「在看」支持小哈呀,謝謝啦