Git 是一個被廣泛使用的版本控制系統,能夠幫助開發者靈活地管理程式碼。但是,有時我們可能需要撤銷已經提交的程式碼。本篇文章將詳細介紹如何使用 Git 命令來撤回已提交但尚未推送的程式碼,以及在不同情境下的最佳實踐。
在以下一些常見情況下,可能需要撤銷已提交的程式碼:
不小心提交了包含密碼或 API 金鑰的程式碼。
提交的程式碼不完整或存在問題,需要進一步修改。
提交資訊填寫錯誤,需要重新整理。
將個人配置檔案或私有依賴提交到共享倉庫,影響團隊協作。
想將多次零散的提交合併爲一個更有意義的提交。
在這些情況下,Git 撤回功能非常有用,可以幫助你修正錯誤、最佳化提交歷史,並保持程式碼庫的整潔和安全。
Git Reset 模式
git reset
命令有三種主要模式用於撤銷提交:--soft
、--mixed
和 --hard
。
--soft
:撤銷提交,但保留暫存區的狀態,適用於需要保留程式碼改動的情況。--mixed
(預設):撤銷提交併清除暫存區的狀態,但保留工作目錄中的程式碼改動。--hard
:刪除提交併刪除工作目錄中的程式碼改動。
選擇合適的模式非常重要,尤其在使用 --hard
模式時要特別謹慎,因為它可能導致程式碼無法恢復的丟失。
如何撤銷已提交(commit)的程式碼
基本撤銷方法
可以使用 git reset
命令來撤銷提交,根據不同需求,有以下三種模式:
--soft 模式
不刪除工作目錄中的程式碼改動。
只撤銷提交,保留暫存區的狀態。
使用命令:
git reset --soft HEAD^
--mixed 模式(預設)
不刪除工作目錄中的程式碼改動。
撤銷提交和暫存區的狀態。
使用命令:
git reset HEAD^
或
git reset --mixed HEAD^
--hard 模式
刪除工作目錄中的程式碼改動。
撤銷提交和暫存區狀態。
使用命令:
git reset --hard HEAD^
撤銷指定的提交版本
可以透過以下方式指定要撤銷的版本:
使用
HEAD^
表示上一個提交版本:git reset --soft HEAD^ # 撤銷最近一次提交 git reset --soft HEAD~2 # 撤銷最近兩次提交
使用提交的 commit ID:
git reset --soft <commit-id> # 回退到指定的提交版本
修改提交資訊
如果只需要修改最後一次提交的註釋資訊,可以使用以下命令:
git commit --amend
注意事項
git reset
只能回滾最新的提交,無法單獨回滾某個歷史提交。如果程式碼已推送到遠端倉庫,需要在本地執行
reset
後,再強制推送:git push origin <branch-name> --force
建議使用
--soft
模式,以避免丟失程式碼改動。
如何撤回已推送(Push)的程式碼
方法一:使用 git revert
(推薦)
git revert
是最安全的方式,因為它不會刪除提交歷史:
# 1. 檢視提交歷史 git log # 2. 撤銷指定的 commit git revert <commit-id> # 3. 推送到遠端倉庫 git push origin <branch-name>
這種方法會透過建立一個新的提交來撤銷之前的更改。
方法二:使用 git reset
這種方式會修改提交歷史,需謹慎使用:
# 1. 使用 reset 回退版本 git reset --soft HEAD^ # 撤銷最近一次 commit,保留程式碼改動 # 或 git reset --hard HEAD^ # 撤銷 commit 並刪除程式碼改動 # 2. 強制推送到遠端 git push -f origin <branch-name>
reset
有三種模式:
--soft
:只撤銷 commit,保留程式碼修改。--mixed
:撤銷 commit 和 add,保留程式碼修改。--hard
:完全撤銷修改,刪除程式碼改動。
注意事項
使用
git revert
更安全,因為它不會刪除提交歷史。使用
git reset --force
時要謹慎,因為它會重寫歷史,可能影響其他開發者。如果其他人已經拉取了要撤銷的程式碼,建議使用
git revert
而不是reset
。在執行這些操作之前,建議先備份程式碼或建立一個新分支。