一、git reset
?的核心作用
用于?移動當前分支的?HEAD
?指針?到指定的提交,并可選擇是否修改工作區和暫存區。
?? 注意:若提交已被推送到遠程倉庫,強制重置(--hard
)后需謹慎操作,避免影響協作。
二、三種模式對比
模式 | 命令示例 | 影響范圍 | 適用場景 |
---|---|---|---|
--soft | git reset --soft HEAD~1 | 僅移動?HEAD ,保留修改在?暫存區 | 修改提交信息或合并提交 |
--mixed | git reset HEAD~1 | 移動?HEAD ,保留修改在?工作區 | 撤銷提交但保留代碼修改(默認模式) |
--hard | git reset --hard HEAD~1 | 移動?HEAD ,丟棄所有修改 | 徹底回退到歷史版本(慎用!) |
三、詳細使用場景
1. 回退到指定提交
?
# 查看提交歷史,獲取目標 commit-hash
git log --oneline# 回退到指定提交(默認 --mixed)
git reset abc1234
2. 撤銷最近一次提交但保留代碼
git reset HEAD~1 # 或 git reset --mixed HEAD~1
?
-
修改會保留在工作目錄,可重新編輯后提交。
3. 修改最后一次提交(不產生新提交)
git add <漏掉的文件> # 添加遺漏的修改
git reset --soft HEAD~1 # 撤銷提交但保留修改到暫存區
git commit -m "新描述" # 重新提交
4. 徹底丟棄本地所有修改
git reset --hard HEAD # 丟棄所有未提交的修改(包括工作區和暫存區)
四、關鍵參數詳解
1. 指定回退步數
-
HEAD~1
:回退 1 個提交 -
HEAD~3
:回退 3 個提交
2. 回退到遠程倉庫狀態
git reset --hard origin/main # 強制與遠程 main 分支一致
3. 回退單個文件
git reset HEAD~1 -- path/to/file # 僅回退該文件到指定版本
git checkout HEAD~1 -- path/to/file # 替代方案(保留提交歷史)
五、與?git revert
?的區別
命令 | 特點 | 適用場景 |
---|---|---|
git reset | 刪除提交歷史,改變?HEAD | 本地未推送的提交回退 |
git revert | 生成新提交來撤銷舊提交 | 已推送提交的撤銷 |
示例:
-
撤銷已推送的提交:
git revert abc123 # 生成一個反向提交 git push # 安全推送
?
六、風險與注意事項
-
--hard
?會永久丟棄修改:-
確保無需保留代碼再使用,或提前?
git stash
?備份。
-
-
強制推送需團隊協商:
git reset --hard HEAD~3 git push -f origin main # 強制覆蓋遠程(謹慎!)
?
3.恢復誤操作:
-
通過?
git reflog
?找回丟失的提交哈希
?
七、可視化示例
初始狀態
A <- B <- C (HEAD -> main)
執行?git reset --soft B
A <- B (HEAD -> main)
# C 的修改保留在暫存區
執行?git reset --mixed B
A <- B (HEAD -> main)
# C 的修改保留在工作區
執行?git reset --hard B
A <- B (HEAD -> main)
# C 的修改被徹底丟棄
八、總結命令速查
需求 | 命令 |
---|---|
撤銷提交但保留代碼 | git reset HEAD~1 |
修改最后一次提交 | git reset --soft HEAD~1 |
徹底回退到歷史版本 | git reset --hard abc123 |
撤銷對單個文件的提交 | git reset HEAD~1 -- file.txt |
?