要撤销在主分支上的 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" ]; then echo "错误:请勿直接在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 工作流程。