要撤銷在主分支上的 git add .
和 git commit
操作,可以按照以下步驟安全回退:
完整回退步驟:
# 1. 查看提交歷史,確認要回退的commit
git log --oneline# 示例輸出:
# d3f4g7h (HEAD -> main) 誤操作提交
# a1b2c3d 之前的正常提交# 2. 回退到上一個提交狀態(保留工作區修改)
git reset --soft HEAD~1# 3. 取消所有已暫存的更改(撤銷git add)
git reset# 4. 檢查當前狀態(應顯示所有修改文件未暫存)
git status# 5. 創建并切換到新分支(正確的工作流程)
git checkout -b feature/my-new-branch# 6. 重新添加并提交更改
git add .
git commit -m "正確的提交消息"# 7. 推送到遠程新分支
git push -u origin feature/my-new-branch
關鍵命令說明:
命令 | 作用 | 說明 |
---|---|---|
git log --oneline | 查看提交歷史 | 確認要回退的commit |
git reset --soft HEAD~1 | 撤銷最后一次commit | 保留所有修改在工作區 |
git reset | 取消所有暫存 | 撤銷 git add . 操作 |
git status | 檢查狀態 | 確認文件處于未暫存狀態 |
git checkout -b <branch> | 創建并切換分支 | 開始正確的工作流程 |
注意事項:
-
如果已經推送到遠程倉庫:
# 強制回退遠程分支(謹慎使用) git push origin main --force
注意:這會覆蓋遠程歷史,確保其他協作者知道這個操作
-
完全丟棄所有修改(如果不需要保留):
# 回退并丟棄所有修改 git reset --hard HEAD~1
-
恢復誤刪的提交(如果操作失誤):
# 查看所有操作記錄 git reflog# 恢復特定commit git reset --hard <commit-hash>
正確的工作流程圖示:
預防措施:
-
保護主分支:
# 禁止直接推送到主分支 git config --global receive.denyCurrentBranch updateInstead
-
使用鉤子防止誤操作:
在.git/hooks/pre-commit
中添加:#!/bin/sh branch=$(git symbolic-ref --short HEAD) if [ "$branch" = "main" ]; thenecho "錯誤:請勿直接在main分支提交!"exit 1 fi
-
別名設置:
# 添加到 ~/.gitconfig [alias]cm = "!f() { if [ \"$(git symbolic-ref --short HEAD)\" = \"main\" ]; then echo '請勿在main分支提交'; else git commit -m \"$1\"; fi }; f"
使用
git cm "消息"
提交時會自動檢查分支
總結:
- 使用
git reset --soft HEAD~1
+git reset
撤銷提交和暫存 - 立即切換到新分支
git checkout -b feature/xxx
- 在新分支重新提交更改
- 推送到遠程并創建合并請求
這樣既能安全回退誤操作,又能保持倉庫整潔,符合標準的 Git 工作流程。