搜尋
首頁科技週邊IT業界用git撤消錯誤的5種方法

5 Ways to Undo Mistakes with Git

軟件開發,無論經驗多豐富,都難免出錯。但優秀程序員與普通程序員的區別在於,他們知道如何撤銷錯誤!

如果你使用 Git 作為版本控制系統,那麼你已經擁有了一套強大的“撤銷工具”。本文將向你展示五種強大的 Git 撤銷錯誤的方法!

關鍵要點

  • Git 允許用戶通過丟棄不需要的本地更改來撤銷代碼中的錯誤。這可以使用 git restore 命令完成,該命令會將文件重置為其最後一次提交的狀態。為了更精細的控制,可以使用 -p 標誌在補丁級別丟棄更改。
  • git log 命令可用於將特定文件恢復到特定版本。用戶可以識別文件損壞的“錯誤提交”,然後使用 git checkout 命令將文件恢復到錯誤提交之前的版本。
  • Git 的 Reflog 工具可用於恢復丟失的版本或已刪除的分支。 Reflog 記錄本地存儲庫中所有 HEAD 指針的移動,允許用戶返回到以前的狀態並恢復丟失的數據。
  • 用戶可以使用 git cherry-pick 命令將提交移動到不同的分支。如果提交到錯誤的分支,用戶可以檢出正確的分支,將提交移動過去,然後使用 git reset 從原始分支中刪除不需要的提交。

丟棄部分本地更改

編碼過程通常很混亂。有時,感覺像是兩步前進,一步後退。換句話說:你編寫的一些代碼很棒……但有些則不然。這就是 Git 可以幫助你的地方:它允許你保留好的部分,並丟棄不再需要的更改。

讓我們來看一個包含一些“本地”更改(即尚未提交的更改)的示例場景。

5 Ways to Undo Mistakes with Git

注意:為了更好的概述和更清晰的可視化,我在一些屏幕截圖中使用了 Tower Git 桌面客戶端。你不需要 Tower 就可以學習本教程。

讓我們先解決 general.css 中的問題。我們所做的更改完全朝著錯誤的方向發展。讓我們撤銷所有更改,並重新創建該文件的最後一次提交狀態:

$ git restore css/general.css

請注意,或者,我也可以使用 git checkout 命令來達到相同的結果。但是因為 git checkout 有很多不同的用途和含義,所以我更傾向於使用稍微更新一些的 git restore 命令(它只專注於這些類型的任務)。

我們在 index.html 中的第二個問題有點棘手。我們在這個文件中做的一些更改實際上是很好的,而只有一部分需要撤銷。

5 Ways to Undo Mistakes with Git

同樣,git restore 命令可以解決問題——但這次要使用 -p 標誌,因為我們要深入到“補丁”級別:

$ git restore css/general.css

然後,Git 會引導你,並詢問你——對於該文件中的每一塊更改——你是否要丟棄它。

5 Ways to Undo Mistakes with Git

你會注意到,我對第一塊更改輸入了“n”(為了保留它),對第二塊更改輸入了“y”(為了丟棄它)。該過程完成後,你會看到只有第一塊有價值的更改保留了下來——就像我們想要的那樣!

將特定文件重置為以前的狀態

有時,你可能想要將特定文件恢復到特定版本。例如,你知道 index.html 在之前的某個時間點工作正常,但現在不行了。這時你想要倒退時間,但只針對這個特定文件,而不是整個項目!

我們首先需要找出我們想要恢復的哪個確切版本。使用正確的參數集,你可以讓 git log 命令顯示你單個文件的歷史記錄:

$ git restore -p index.html

5 Ways to Undo Mistakes with Git

這只會顯示 index.html 被更改的提交,這對於查找導致問題出現的“壞蘋果”版本非常有用。

如果你需要更多信息,並想要查看這些提交的內容,你可以讓 Git 使用 -p 標誌顯示這些提交中的實際更改:

$ git log -- index.html

一旦我們找到了導致我們可愛的小文件損壞的錯誤提交,我們就可以繼續修復錯誤了。我們將通過恢復錯誤提交之前版本的該文件來做到這一點!這很重要:我們不想恢復引入錯誤的提交中的文件,而是恢復最後一個良好狀態——該提交之前的那個提交!

$ git log -p -- index.html

~1 附加到錯誤提交的哈希值將指示 Git 執行以下操作:轉到引用的提交之前的一個版本。

執行該命令後,你會發現 index.html 在你的本地工作副本中被修改了:Git 為我們恢復了該文件的最後一個良好版本!

使用 Reflog 恢復丟失的版本

Git 急救包中的另一個強大的撤銷工具是“Reflog”。你可以把它想像成一個日誌,Git 在其中記錄本地存儲庫中發生的所有 HEAD 指針移動——例如提交、檢出、合併和變基、cherry-pick 和重置。所有更重要的操作都會在這裡被很好地記錄下來!

當然,這樣的日誌非常適合那些事情進展不順利的情況。因此,讓我們先製造一個小災難——然後我們可以用 Reflog 來修復它。

假設你確信你最近的幾次提交都不好:你想擺脫它們,因此使用了 git reset 來返回到之前的版本。結果,“錯誤”提交從你的提交歷史中消失了——正如你想要的那樣。

5 Ways to Undo Mistakes with Git

但正如生活有時那樣,你注意到這是一個壞主意:最終,這些提交並沒有那麼糟糕!但壞消息是,你剛剛將它們從你的存儲庫的提交歷史中刪除了! ?

5 Ways to Undo Mistakes with Git

這是 Git 的 Reflog 工具的經典案例!讓我們看看它如何拯救你:

$ git restore css/general.css

5 Ways to Undo Mistakes with Git

讓我們逐一分解:

  • 首先,Reflog 非常容易打開:一個簡單的 git reflog 就足夠了。
  • 其次,你會注意到記錄的狀態按時間順序排序,最新的狀態在頂部。
  • 如果你仔細觀察,你會發現最頂部的(也就是最新的)項目是一個“重置”操作。這正是我們 20 秒前所做的。顯然,這個日誌有效?
  • 如果我們現在想要撤消我們的無意“重置”,我們可以簡單地返回到之前的狀態——這也在這裡被很好地記錄下來!我們可以簡單地將該先前狀態的提交哈希複製到剪貼板,然後從中開始。

為了恢復此先前狀態,我們可以再次使用 git reset,或者簡單地創建一個新分支:

$ git restore -p index.html

5 Ways to Undo Mistakes with Git

正如我們可以高興地驗證的那樣,我們的新分支包含了我們認為通過意外的 git reset 故障而丟失的提交!

恢復已刪除的分支

Reflog 也可在其他情況下派上用場。例如,當你無意中刪除了一個你真的不應該刪除的分支時。讓我們來看一下我們的示例場景:

$ git log -- index.html

讓我們假設我們的客戶/團隊負責人/項目經理告訴我們,我們一直在開發的漂亮的分析功能不再需要了。我們井井有條,當然會刪除相應的 feature/analytics 分支!

上面你可以看到,在我們的示例場景中,我們當前檢出了該分支:feature/analytics 是我們當前的 HEAD 分支。為了能夠刪除它,我們必須首先切換到另一個分支:

$ git restore css/general.css

Git 告訴我們我們即將做一些非常嚴重的事情:由於 feature/analytics 包含在其他地方不存在的唯一提交,因此刪除它將破壞一些(可能是有價值的)數據。好吧……既然不再需要該功能,我們可以繼續:

$ git restore -p index.html

你可能已經預料到接下來會發生什麼:我們的客戶/團隊負責人/項目經理高興地告訴我們,該功能又回來了! ? 他們畢竟想要繼續進行! ?

同樣,我們面臨一個糟糕的情況,我們可能丟失了寶貴的數據!因此,讓我們看看 Reflog 是否可以再次拯救我們:

$ git log -- index.html

5 Ways to Undo Mistakes with Git

如果你仔細觀察,好消息就會顯而易見。在我們(災難性地)能夠刪除我們的分支之前,我們必須執行 git checkout 以切換到其他分支(因為 Git 不允許你刪除當前分支)。當然,此檢出也記錄在 Reflog 中。為了恢復我們已刪除的分支,我們現在可以簡單地將之前的狀態作為新分支的起點:

$ git log -p -- index.html

瞧:我們的分支起死回生了! ???

如果你碰巧使用的是 Tower 等桌面 GUI,撤消此類錯誤通常就像按下 CMD Z 一樣簡單。

5 Ways to Undo Mistakes with Git

將提交移動到不同的分支

最後,讓我們再來看一個“哦,不!”部門的經典案例:在錯誤的分支上提交。

今天,許多團隊都制定了一條規則,禁止直接提交到長期分支,如“main”、“master”或“develop”。通常,新的提交應該只通過合併/變基到達這些分支。然而,我們有時會忘記並直接提交……

讓我們以以下場景為例。

5 Ways to Undo Mistakes with Git

我們應該在 feature/newsletter 上提交,但無意中在 master 分支上觸發了提交。讓我們一步一步地看看解決方案。

首先,我們必須確保這次我們在正確的分支上,所以我們正在檢出 feature/newsletter

$ git checkout <bad-commit-hash>~1 -- index.html

現在我們可以使用 cherry-pick 命令安全地將該提交移動過去:

$ git reflog

我們可以查看 feature/newsletter,將會看到該提交現在也存在於這裡。

5 Ways to Undo Mistakes with Git

到目前為止,一切順利。但是 cherry-pick 沒有從 master 分支(它永遠不應該在那裡)刪除提交。因此,我們也必須在那裡清理我們的爛攤子:

$ git restore css/general.css

我們切換回 master,然後使用 git reset 從歷史記錄中刪除(這裡)不需要的提交。

最後,一切又恢復正常了——所以你現在可以開始你的快樂舞蹈了! ???

撤銷錯誤是一種超能力

我以前說過,而且不幸的是我們都知道這是真的:我們無法避免錯誤!無論我們多麼優秀的程序員,我們都會不時地搞砸。因此,問題不在於我們是否犯錯,而在於我們如何有效地處理它們並解決問題

如果你想了解更多關於 Git 撤銷工具的信息,我強烈推薦“Git 急救包”。這是一個(免費的)簡短視頻合集,向你展示如何在 Git 中清理和撤消錯誤。

祝你開發順利,勇於嘗試,當然也要善於修復!

關於使用 Git 撤銷錯誤的常見問題解答 (FAQ)

git resetgit revert 有什麼區別?

git resetgit revert 是兩個幫助你撤消 Git 存儲庫中更改的命令,但它們的工作方式不同。 git reset 將你的 HEAD 指針移動到特定的提交。這意味著它實際上“忘記”了你在重置到的提交之後的所有提交。這是一個破壞性操作,應該謹慎使用。另一方面,git revert 創建一個新的提交來撤消特定提交中所做的更改。這是一個安全的操作,因為它不會更改現有歷史記錄。

如何撤消 git add 操作?

如果你已經使用 git add 暫存了更改,並且想要撤消此操作,可以使用 git reset 命令。例如,如果你想要取消暫存特定文件,可以使用命令 git reset <file></file>。如果你想要取消暫存所有更改,可以使用 git reset 而不指定文件。

我可以撤消 git commit 嗎?

是的,你可以使用 git resetgit revert 命令撤消 git commitgit reset 將你的 HEAD 指針移回到你想要撤消的提交之前的提交,有效地擦除不需要的提交。另一方面,git revert 將創建一個新的提交來撤消不需要的提交中所做的更改。

如何撤消特定文件中的更改?

如果你已經對特定文件進行了更改,並且想要撤消這些更改,可以使用 git checkout 命令。例如,git checkout -- <file></file> 將丟棄指定文件的本地工作目錄中的更改。

git stash 是什麼?

git stash 是一個允許你臨時保存你不想立即提交的更改的命令。如果你需要切換到不同的分支,但不想提交當前更改,這將非常有用。你可以稍後使用 git stash apply 應用暫存的更改。

如何查看我的 Git 歷史記錄?

你可以使用 git log 命令查看你的 Git 歷史記錄。這將向你顯示存儲庫中所有提交的列表,以及它們的提交消息。

我可以撤消 git push 嗎?

是的,你可以撤消 git push,但這比撤消本地更改要復雜一些。你需要使用帶有 -f--force 選項的 git push 命令來用你的本地存儲庫覆蓋遠程存儲庫。要小心使用此命令,因為它可能會對正在處理同一存儲庫的其他人員造成問題。

如何撤消多個提交?

如果你想要撤消多個提交,可以使用 git reset 命令以及 HEAD~<number></number> 語法。例如,git reset HEAD~3 將你的 HEAD 指針移回到三個提交之前。

軟重置和硬重置有什麼區別?

軟重置將你的 HEAD 指針移動到特定的提交,但不會更改你的工作目錄和暫存區。這意味著你仍然會看到來自“已忘記”提交的更改作為未提交的更改。另一方面,硬重置將丟棄工作目錄和暫存區中的所有更改,有效地將你的存儲庫恢復到指定提交時的狀態。

硬重置後我可以恢復提交嗎?

是的,硬重置後可以恢復提交,但這並不簡單。 Git 會在 reflog 中保留所有 ref 更新(例如移動 HEAD 指針)的日誌。你可以使用 git reflog 命令找到你想要恢復的提交,然後使用 git branch 在該提交處創建一個新分支。

以上是用git撤消錯誤的5種方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
使用AWS ECS和LAMBDA的無服務器圖像處理管道使用AWS ECS和LAMBDA的無服務器圖像處理管道Apr 18, 2025 am 08:28 AM

該教程通過使用AWS服務來指導您通過構建無服務器圖像處理管道。 我們將創建一個部署在ECS Fargate群集上的next.js前端,與API網關,Lambda函數,S3桶和DynamoDB進行交互。 Th

CNCF ARM64飛行員:影響和見解CNCF ARM64飛行員:影響和見解Apr 15, 2025 am 08:27 AM

該試點程序是CNCF(雲本機計算基礎),安培計算,Equinix金屬和驅動的合作,簡化了CNCF GitHub項目的ARM64 CI/CD。 該計劃解決了安全問題和績效

使用GO構建網絡漏洞掃描儀使用GO構建網絡漏洞掃描儀Apr 01, 2025 am 08:27 AM

此基於GO的網絡漏洞掃描儀有效地確定了潛在的安全弱點。 它利用了GO的並發功能的速度功能,包括服務檢測和漏洞匹配。讓我們探索它的能力和道德

2025年最佳10個最佳免費反向鏈接檢查器工具2025年最佳10個最佳免費反向鏈接檢查器工具Mar 21, 2025 am 08:28 AM

網站建設只是第一步:SEO與反向鏈接的重要性 建立網站只是將其轉化為寶貴營銷資產的第一步。您需要進行SEO優化,以提高網站在搜索引擎中的可見度,吸引潛在客戶。反向鏈接是提升網站排名的關鍵,它向谷歌和其他搜索引擎表明您的網站權威性和可信度。 並非所有反向鏈接都有利:識別並避免有害鏈接 並非所有反向鏈接都有益。有害鏈接會損害您的排名。優秀的免費反向鏈接檢查工具可以監控鏈接到您網站的來源,並提醒您注意有害鏈接。此外,您還可以分析競爭對手的鏈接策略,從中學習借鑒。 免費反向鏈接檢查工具:您的SEO情報員

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。