当前位置: 首页 > news >正文

如何撤销Git提交误操作

要撤销在主分支上的 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>创建并切换分支开始正确的工作流程

注意事项:

  1. 如果已经推送到远程仓库

    # 强制回退远程分支(谨慎使用)
    git push origin main --force
    

    注意:这会覆盖远程历史,确保其他协作者知道这个操作

  2. 完全丢弃所有修改(如果不需要保留):

    # 回退并丢弃所有修改
    git reset --hard HEAD~1
    
  3. 恢复误删的提交(如果操作失误):

    # 查看所有操作记录
    git reflog# 恢复特定commit
    git reset --hard <commit-hash>
    

正确的工作流程图示:

开始工作
是否在主分支?
git checkout -b feature/new
继续工作
修改代码
git add & commit
git push origin feature/new
创建合并请求
代码审查
合并到主分支

预防措施:

  1. 保护主分支

    # 禁止直接推送到主分支
    git config --global receive.denyCurrentBranch updateInstead
    
  2. 使用钩子防止误操作
    .git/hooks/pre-commit 中添加:

    #!/bin/sh
    branch=$(git symbolic-ref --short HEAD)
    if [ "$branch" = "main" ]; thenecho "错误:请勿直接在main分支提交!"exit 1
    fi
    
  3. 别名设置

    # 添加到 ~/.gitconfig
    [alias]cm = "!f() { if [ \"$(git symbolic-ref --short HEAD)\" = \"main\" ]; then echo '请勿在main分支提交'; else git commit -m \"$1\"; fi }; f"
    

    使用 git cm "消息" 提交时会自动检查分支

总结:

  1. 使用 git reset --soft HEAD~1 + git reset 撤销提交和暂存
  2. 立即切换到新分支 git checkout -b feature/xxx
  3. 在新分支重新提交更改
  4. 推送到远程并创建合并请求

这样既能安全回退误操作,又能保持仓库整洁,符合标准的 Git 工作流程。

http://www.dtcms.com/a/291678.html

相关文章:

  • 实用资源分享:50款出入库单据Excel模板集合
  • DFS习题篇【下】
  • 北京养老金计算公式网页实现案例:从需求分析到架构设计
  • 业务流逻辑如何搭建?为何橙武平台选用了 LogicFlow?
  • 【MyBatisPlus】一文讲清 MyBatisPlus 基本原理及基本使用方式
  • EMA《2025-2028年药品监管中的数据与AI 1.3版》信息分析
  • 深度分析:Kimi K2开源模型
  • 拆分、合并PDF
  • Qt基本控件使用:按钮、标签、文本框等
  • docker阿里云安装
  • [2025CVPR]ViKIENet:通过虚拟密钥实例增强网络实现高效的 3D 对象检测
  • AI Agent-Manus 构建经验解读(下)
  • powerquery如何实现表的拼接主键
  • mybatis多对一一对多的关联及拼接操作以及缓存处理
  • Java 与 Android 回收机制深度解析
  • 行业出海研究报告
  • Apache Ignite 中的 SQL 模式(Schema)管理机制
  • Qt字符串处理与正则表达式应用
  • MCP vs 传统集成方案:REST API、GraphQL、gRPC的终极对比
  • 使用vue-pdf-embed发现某些文件不显示内容
  • Jenkins接口自动化测试(构建)平台搭建
  • Jenkins 多架构并发构建实战
  • 计算机网络:连接世界的数字脉络
  • Python爬虫实战:研究pymorphy2库相关技术
  • JVM:工具
  • 字节跳动视觉算法面试30问全景精解
  • Python爬虫实战:研究PyPLN库相关技术
  • PCIe之P2P应用
  • 从ZooKeeper到KRaft:Kafka架构演进与无ZooKeeper部署指南
  • Android perfetto 工具使用